code-coordinator 0.5.225__tar.gz → 0.5.227__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 (810) hide show
  1. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/CLAUDE.md +12 -0
  2. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/PKG-INFO +1 -1
  4. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/scm_version.json +2 -2
  5. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/reconcile.py +134 -29
  6. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/test_author.py +50 -0
  7. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_drive.py +6 -0
  8. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_no_agent_record.py +186 -1
  9. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_author.py +82 -0
  10. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.claude/commands/board.md +0 -0
  11. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.claude/commands/complete-session.md +0 -0
  12. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.claude/commands/coordinator.md +0 -0
  13. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.githooks/_lib.sh +0 -0
  14. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.githooks/post-checkout +0 -0
  15. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.githooks/post-commit +0 -0
  16. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.githooks/post-merge +0 -0
  17. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  18. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/coord-ci-acceptance.yml +0 -0
  19. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/workflows/auto-release.yml +0 -0
  20. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/workflows/cargo-test.yml +0 -0
  21. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/workflows/publish.yml +0 -0
  22. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/workflows/release-tui.yml +0 -0
  23. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/workflows/test.yml +0 -0
  24. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.gitignore +0 -0
  25. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/GOAL.md +0 -0
  26. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/LICENSE +0 -0
  27. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/MANIFEST.in +0 -0
  28. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/README.md +0 -0
  29. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/SOURCES.txt +0 -0
  30. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/dependency_links.txt +0 -0
  31. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/entry_points.txt +0 -0
  32. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/requires.txt +0 -0
  33. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/scm_file_list.json +0 -0
  34. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agent.py +0 -0
  40. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agent_app.py +0 -0
  41. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agent_update.py +0 -0
  42. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agents/opencode/.gitignore +0 -0
  43. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agents/opencode/agents/work.md +0 -0
  44. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agents/opencode/routing.jsonc +0 -0
  45. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/approved_work.py +0 -0
  46. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/block_log.py +0 -0
  49. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/board_bool_guard.py +0 -0
  50. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/ci_fix.py +0 -0
  57. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/ci_github.py +0 -0
  58. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/ci_gitlab.py +0 -0
  59. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/client.py +0 -0
  63. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/drive_queue.py +0 -0
  73. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/gate_a.py +0 -0
  74. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/gates.py +0 -0
  75. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/issues.py +0 -0
  76. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/lifecycle.py +0 -0
  77. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/merge.py +0 -0
  78. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/milestone.py +0 -0
  79. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/plan_followup.py +0 -0
  80. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/plans.py +0 -0
  81. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/portal.py +0 -0
  82. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/release.py +0 -0
  83. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/repo.py +0 -0
  84. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/report.py +0 -0
  85. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/review.py +0 -0
  86. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/scorecard.py +0 -0
  87. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/sessions.py +0 -0
  88. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/setup.py +0 -0
  89. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/status.py +0 -0
  90. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/terminal.py +0 -0
  91. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/test_gate.py +0 -0
  92. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/tui.py +0 -0
  93. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/comments.py +0 -0
  94. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/config.py +0 -0
  95. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/config_reload.py +0 -0
  96. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/confirm_test.py +0 -0
  97. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/conflict_fix.py +0 -0
  98. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dao.py +0 -0
  99. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dashboard/__init__.py +0 -0
  100. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dashboard/fixture.py +0 -0
  101. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dashboard/index.html +0 -0
  102. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dashboard/server.py +0 -0
  103. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dashboard/terminal.py +0 -0
  104. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/db.py +0 -0
  105. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dead_end.py +0 -0
  106. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/README.md +0 -0
  107. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-agent.service +0 -0
  108. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-db-backup.service +0 -0
  109. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-db-backup.sh +0 -0
  110. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-db-backup.timer +0 -0
  111. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-drive-queue.service +0 -0
  112. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-drive-queue.timer +0 -0
  113. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-notify.service +0 -0
  114. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-notify.timer +0 -0
  115. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-release-propagate.service +0 -0
  116. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-release-propagate.timer +0 -0
  117. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-release-window.service +0 -0
  118. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-release-window.timer +0 -0
  119. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-serve.service +0 -0
  120. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-web-dist-build.service +0 -0
  121. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-web-dist-build.timer +0 -0
  122. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-web.service +0 -0
  123. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy_manifest.py +0 -0
  124. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy_units.py +0 -0
  125. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deps.py +0 -0
  126. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/diagnose.py +0 -0
  127. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dispatch.py +0 -0
  128. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dist_name.py +0 -0
  129. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/drive.py +0 -0
  130. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/drive_queue.py +0 -0
  131. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/drive_state.py +0 -0
  132. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/events.py +0 -0
  133. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/failure_class.py +0 -0
  134. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/filelock.py +0 -0
  135. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/fleet_config_health.py +0 -0
  136. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/forge_availability.py +0 -0
  137. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/freshness.py +0 -0
  138. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/gate_a.py +0 -0
  139. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/gate_b.py +0 -0
  140. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/gate_snapshot.py +0 -0
  141. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/gates.py +0 -0
  142. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/github_ops.py +0 -0
  143. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/goal.py +0 -0
  144. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/graph_health.py +0 -0
  145. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/__init__.py +0 -0
  146. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/aggregate.py +0 -0
  147. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/__init__.py +0 -0
  148. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/agent_install.py +0 -0
  149. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/cargo_targets.py +0 -0
  150. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/claude_binary.py +0 -0
  151. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/coord_web_ci_pin.py +0 -0
  152. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/deploy_lane_facts.py +0 -0
  153. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/disk.py +0 -0
  154. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/fleet_board.py +0 -0
  155. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  156. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/fleet_phantom.py +0 -0
  157. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/fleet_unit_drift.py +0 -0
  158. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/graph.py +0 -0
  159. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/graphify_cli.py +0 -0
  160. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/index_lock.py +0 -0
  161. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/plan_usage.py +0 -0
  162. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/repo_state.py +0 -0
  163. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/spawned_coord.py +0 -0
  164. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/timer_active.py +0 -0
  165. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/toolchain.py +0 -0
  166. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/unit_drift.py +0 -0
  167. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/unit_enablement.py +0 -0
  168. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/worktrees.py +0 -0
  169. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/cli.py +0 -0
  170. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/context.py +0 -0
  171. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/fleet_snapshot.py +0 -0
  172. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/models.py +0 -0
  173. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/pypi.py +0 -0
  174. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/registry.py +0 -0
  175. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/render.py +0 -0
  176. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/units.py +0 -0
  177. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/hooks.py +0 -0
  178. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/housekeeping.py +0 -0
  179. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/interactive.py +0 -0
  180. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/issue_store.py +0 -0
  181. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/liveness_auditor.py +0 -0
  182. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/machine_pause.py +0 -0
  183. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/merge_queue.py +0 -0
  184. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/milestone_chat.py +0 -0
  185. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/milestone_dispatch.py +0 -0
  186. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/milestone_gate.py +0 -0
  187. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/milestone_order.py +0 -0
  188. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/mock_author.py +0 -0
  189. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/models.py +0 -0
  190. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/network.py +0 -0
  191. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/new_issue_chat.py +0 -0
  192. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/__init__.py +0 -0
  193. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/baseline.py +0 -0
  194. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/cli.py +0 -0
  195. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/collect.py +0 -0
  196. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/digest.py +0 -0
  197. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/models.py +0 -0
  198. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/predicate.py +0 -0
  199. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/service.py +0 -0
  200. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/store.py +0 -0
  201. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/transport.py +0 -0
  202. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notify.py +0 -0
  203. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/openapi.py +0 -0
  204. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/overlap_fence.py +0 -0
  205. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/overlap_predict.py +0 -0
  206. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/parentage.py +0 -0
  207. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/parentage_github.py +0 -0
  208. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/pipeline.py +0 -0
  209. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/plan_parser.py +0 -0
  210. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/plans.py +0 -0
  211. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/platform_paths.py +0 -0
  212. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/portal_bridge.py +0 -0
  213. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/portal_store.py +0 -0
  214. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/portal_sync.py +0 -0
  215. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/pr_body_lint.py +0 -0
  216. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/prereqs.py +0 -0
  217. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/progress.py +0 -0
  218. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/providers/__init__.py +0 -0
  219. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/providers/base.py +0 -0
  220. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/providers/claude.py +0 -0
  221. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/providers/claude_pty.py +0 -0
  222. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/providers/opencode.py +0 -0
  223. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/queue_diagnose.py +0 -0
  224. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/reconcile_tick.py +0 -0
  225. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/refine_chat.py +0 -0
  226. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/release_cordon.py +0 -0
  227. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/release_propagate.py +0 -0
  228. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/release_verify.py +0 -0
  229. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/release_window.py +0 -0
  230. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/repo_edit.py +0 -0
  231. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/repo_onboard.py +0 -0
  232. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/reports.py +0 -0
  233. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/revalidate.py +0 -0
  234. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/review.py +0 -0
  235. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/scorecard.py +0 -0
  236. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/self_health.py +0 -0
  237. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/serve_app.py +0 -0
  238. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  239. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  240. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  241. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  242. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  243. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/portal-followup/SKILL.md +0 -0
  244. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  245. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  246. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/update-issue/SKILL.md +0 -0
  247. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/smoke.py +0 -0
  248. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/spend_ceiling.py +0 -0
  249. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/split_work.py +0 -0
  250. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/stage_projection.py +0 -0
  251. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/state.py +0 -0
  252. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/test_chat.py +0 -0
  253. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/test_orchestrator.py +0 -0
  254. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/test_report.py +0 -0
  255. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/tui_release.py +0 -0
  256. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/usage.py +0 -0
  257. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/usage_limits.py +0 -0
  258. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/usage_rollup.py +0 -0
  259. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/worker_events.py +0 -0
  260. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coordinator.example.yml +0 -0
  261. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-agent.service +0 -0
  262. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-db-backup.service +0 -0
  263. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-db-backup.sh +0 -0
  264. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-db-backup.timer +0 -0
  265. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-drive-queue.service +0 -0
  266. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-drive-queue.timer +0 -0
  267. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-notify.service +0 -0
  268. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-notify.timer +0 -0
  269. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-release-propagate.service +0 -0
  270. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-release-propagate.timer +0 -0
  271. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-release-window.service +0 -0
  272. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-release-window.timer +0 -0
  273. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-serve.service +0 -0
  274. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-web-dist-build.service +0 -0
  275. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-web-dist-build.sh +0 -0
  276. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-web-dist-build.timer +0 -0
  277. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-web-rollback.sh +0 -0
  278. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-web.service +0 -0
  279. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/node-shim.sh +0 -0
  280. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  281. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ADR_COORD_WEB_CI.md +0 -0
  282. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ADR_COORD_WEB_DIST.md +0 -0
  283. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/AGENT_OPERATIONS.md +0 -0
  284. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ARCHITECTURE.md +0 -0
  285. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ARCH_SECURITY_GATES.md +0 -0
  286. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/COCKPIT.md +0 -0
  287. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/CONTROL_CENTER.md +0 -0
  288. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/COST_DISCIPLINE.md +0 -0
  289. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/CROSS_PLATFORM.md +0 -0
  290. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/CUSTOMER_PORTAL.md +0 -0
  291. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/DRIVE_QUEUE.md +0 -0
  292. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/EPHEMERAL_WORKERS.md +0 -0
  293. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/FORGE_MIGRATION.md +0 -0
  294. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/GRAPHIFY_SETUP.md +0 -0
  295. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ISSUE_GUIDANCE.md +0 -0
  296. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/MAC_MINI.md +0 -0
  297. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  298. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/NOTIFIER.md +0 -0
  299. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/OPENCODE_VERIFICATION.md +0 -0
  300. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/OPERATING_GOTCHAS.md +0 -0
  301. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ORACLE_LOOP.md +0 -0
  302. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/PHONE_WEBAPP.md +0 -0
  303. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/PIPELINE_V2.md +0 -0
  304. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/PLATFORM_EVOLUTION.md +0 -0
  305. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/SECOND_BACKEND.md +0 -0
  306. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/STORE_SERVICE.md +0 -0
  307. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  308. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/WEB_CONTROL_CENTER.md +0 -0
  309. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/WSL_WINDOWS_WORKER.md +0 -0
  310. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/mocks/web/README.md +0 -0
  311. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/mocks/web/_tokens.css +0 -0
  312. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/mocks/web/issue-detail.html +0 -0
  313. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/mocks/web/pipeline-narrow.html +0 -0
  314. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/mocks/web/pipeline-wide.html +0 -0
  315. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/graphify-out/.gitignore +0 -0
  316. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/install-agent.sh +0 -0
  317. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/pyproject.toml +0 -0
  318. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/audit_review_verdict_overrides.py +0 -0
  319. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  320. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/build-worker-image.sh +0 -0
  321. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/coordinator-machine.py +0 -0
  322. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/epic-down.sh +0 -0
  323. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/epic-up.sh +0 -0
  324. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/preflight.sh +0 -0
  325. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/provision-worker.sh +0 -0
  326. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  327. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  328. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/verify-github-token.sh +0 -0
  329. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/check_gh_argv_containment.py +0 -0
  330. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/codegen.py +0 -0
  331. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/coord-test-runner.sh +0 -0
  332. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/drive-batch.sh +0 -0
  333. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/gen_board_fixture.py +0 -0
  334. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/gen_mock_index.py +0 -0
  335. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/next_release_tag.py +0 -0
  336. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/run_tests_in_populated_home.sh +0 -0
  337. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/run_tests_without_gh.sh +0 -0
  338. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/smoke_437_interactive.py +0 -0
  339. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/verify_878_review_capture.py +0 -0
  340. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/verify_release_published.py +0 -0
  341. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/verify_release_wheel.py +0 -0
  342. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/setup.cfg +0 -0
  343. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/SMOKE_SET.md +0 -0
  344. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/__init__.py +0 -0
  345. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  346. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/contract.md +0 -0
  347. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/manifest.yml +0 -0
  348. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  349. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  350. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  351. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  352. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-37/conftest.py +0 -0
  353. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-37/contract.md +0 -0
  354. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-37/manifest.yml +0 -0
  355. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  356. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  357. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/contract.md +0 -0
  358. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/manifest.yml +0 -0
  359. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  360. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  361. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  362. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  363. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  364. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  365. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  366. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  367. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  368. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  369. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/contract.md +0 -0
  370. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  371. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  372. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/manifest.yml +0 -0
  373. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  374. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/tsconfig.json +0 -0
  375. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  376. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  377. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  378. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/contract.md +0 -0
  379. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  380. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/manifest.yml +0 -0
  381. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  382. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  383. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  384. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  385. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  386. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  387. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  388. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  389. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  390. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  391. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  392. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  393. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/contract.md +0 -0
  394. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/manifest.yml +0 -0
  395. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  396. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  397. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  398. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  399. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  400. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  401. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/conftest.py +0 -0
  402. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/board-pipeline-basic.json +0 -0
  403. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  404. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  405. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  406. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  407. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/all_pass.json +0 -0
  408. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  409. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/mixed_fail.json +0 -0
  410. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  411. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  412. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/skip.json +0 -0
  413. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/truncated.json +0 -0
  414. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  415. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  416. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  417. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  418. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  419. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  420. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  421. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  422. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_acceptance.py +0 -0
  423. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_acceptance_drivers.py +0 -0
  424. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent.py +0 -0
  425. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_api_error.py +0 -0
  426. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_app.py +0 -0
  427. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_branch_base.py +0 -0
  428. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_branch_capture.py +0 -0
  429. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_config_free_1712.py +0 -0
  430. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_deploy_units_endpoint.py +0 -0
  431. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_dirty_worktree.py +0 -0
  432. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  433. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_graph_self_heal.py +0 -0
  434. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_health_h3.py +0 -0
  435. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_idle_restart.py +0 -0
  436. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_push_failure.py +0 -0
  437. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_reap.py +0 -0
  438. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_repos_and_pull.py +0 -0
  439. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_restart_services_endpoint.py +0 -0
  440. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_skills_self_heal.py +0 -0
  441. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_startup_diagnostics.py +0 -0
  442. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_update.py +0 -0
  443. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_update_bluegreen.py +0 -0
  444. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_usage_limit.py +0 -0
  445. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_zero_commit.py +0 -0
  446. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ambient_home_isolation.py +0 -0
  447. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_approve_reject_plan.py +0 -0
  448. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_approve_usage_gate.py +0 -0
  449. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_approved_work_2532.py +0 -0
  450. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_assignment_already_recorded_daemon.py +0 -0
  451. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_audit_log.py +0 -0
  452. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_audit_outcome.py +0 -0
  453. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_audit_query.py +0 -0
  454. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_auto_loop.py +0 -0
  455. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_auto_release_publish_2035.py +0 -0
  456. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_base_checkout_restore.py +0 -0
  457. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_block_log.py +0 -0
  458. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_cap_762.py +0 -0
  459. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_fixture.py +0 -0
  460. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_read_path.py +0 -0
  461. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_service.py +0 -0
  462. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_state.py +0 -0
  463. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_wire.py +0 -0
  464. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_brain.py +0 -0
  465. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_branch_model.py +0 -0
  466. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_bug_intake.py +0 -0
  467. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_build_worker_image_env_update.py +0 -0
  468. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cargo_cache.py +0 -0
  469. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_check_gh_argv_containment.py +0 -0
  470. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ci_acceptance_gate_1950.py +0 -0
  471. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ci_fix.py +0 -0
  472. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ci_gitlab.py +0 -0
  473. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ci_parity_2091.py +0 -0
  474. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ci_store.py +0 -0
  475. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_claim.py +0 -0
  476. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_acceptance.py +0 -0
  477. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_assign.py +0 -0
  478. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  479. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_assign_interactive_remote.py +0 -0
  480. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_assign_provider.py +0 -0
  481. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  482. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_audit.py +0 -0
  483. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_chat_continue.py +0 -0
  484. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_decide.py +0 -0
  485. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_diagnose_config_provenance.py +0 -0
  486. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_diagnose_forge_availability.py +0 -0
  487. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_diagnose_graph.py +0 -0
  488. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_diagnose_self.py +0 -0
  489. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_doctor.py +0 -0
  490. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_doctor_config_free_1801.py +0 -0
  491. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  492. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_drive.py +0 -0
  493. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_drive_queue.py +0 -0
  494. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_escalate.py +0 -0
  495. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_fix_headless_review.py +0 -0
  496. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_gate_a.py +0 -0
  497. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_install_drift.py +0 -0
  498. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_install_skills.py +0 -0
  499. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_issue_create_label.py +0 -0
  500. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_issue_reopen.py +0 -0
  501. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_merge.py +0 -0
  502. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_assign.py +0 -0
  503. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_capture.py +0 -0
  504. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_chat_add_child.py +0 -0
  505. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_dispatch.py +0 -0
  506. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_gate_b.py +0 -0
  507. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_gate_c.py +0 -0
  508. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_order.py +0 -0
  509. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  510. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_ship.py +0 -0
  511. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_network.py +0 -0
  512. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_new_issue_chat.py +0 -0
  513. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_plans.py +0 -0
  514. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_portal.py +0 -0
  515. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_pull_artifact.py +0 -0
  516. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_queue.py +0 -0
  517. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_reattach_sessions.py +0 -0
  518. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_refine_board.py +0 -0
  519. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_release_preflight.py +0 -0
  520. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_release_propagate.py +0 -0
  521. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_release_window.py +0 -0
  522. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_repo_2220.py +0 -0
  523. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_scorecard.py +0 -0
  524. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_set_review_findings.py +0 -0
  525. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_advisory_terminal.py +0 -0
  526. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_merge_queue.py +0 -0
  527. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_provider.py +0 -0
  528. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_review_finalizing.py +0 -0
  529. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_test_failed_tag.py +0 -0
  530. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_usage_limit.py +0 -0
  531. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_sync_comments_873.py +0 -0
  532. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_test_plan.py +0 -0
  533. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_track.py +0 -0
  534. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_tui_update.py +0 -0
  535. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_wait.py +0 -0
  536. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_client_base_install.py +0 -0
  537. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_comments.py +0 -0
  538. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_completion_summary.py +0 -0
  539. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config.py +0 -0
  540. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config_acceptance.py +0 -0
  541. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config_audit.py +0 -0
  542. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config_pricing.py +0 -0
  543. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  544. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config_usage_gate.py +0 -0
  545. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_confirm_test.py +0 -0
  546. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_conflict_fix.py +0 -0
  547. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_conflict_fix_semantic.py +0 -0
  548. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_test.py +0 -0
  549. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_test_runner_baseline.py +0 -0
  550. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_test_runner_populated_home.py +0 -0
  551. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_test_runner_routing.py +0 -0
  552. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_test_runner_toolchain.py +0 -0
  553. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_web_sse_restart_live.py +0 -0
  554. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coordinator_machine.py +0 -0
  555. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cross_platform_imports.py +0 -0
  556. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dashboard.py +0 -0
  557. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dashboard_fixture.py +0 -0
  558. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dashboard_terminal.py +0 -0
  559. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dashboard_terminal_live.py +0 -0
  560. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_db.py +0 -0
  561. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dead_end.py +0 -0
  562. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_coord_db_backup.py +0 -0
  563. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_coord_web_dist.py +0 -0
  564. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_coord_web_rollback.py +0 -0
  565. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_drive_queue_unit.py +0 -0
  566. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_manifest.py +0 -0
  567. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_notify_unit.py +0 -0
  568. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_units_lane.py +0 -0
  569. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_web_unit.py +0 -0
  570. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deps.py +0 -0
  571. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_diagnose.py +0 -0
  572. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dispatch.py +0 -0
  573. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dispatch_target_validation.py +0 -0
  574. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dist_name.py +0 -0
  575. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_done_housekeeping.py +0 -0
  576. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_drive_queue.py +0 -0
  577. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_drive_state.py +0 -0
  578. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_drive_tmux.py +0 -0
  579. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_epic_up_capability_detection.py +0 -0
  580. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  581. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_epic_up_image_provenance.py +0 -0
  582. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_errors.py +0 -0
  583. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_events.py +0 -0
  584. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_failure_class.py +0 -0
  585. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_filelock.py +0 -0
  586. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  587. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_fix_of_force_override.py +0 -0
  588. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_fleet_config_health.py +0 -0
  589. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_fleet_health_probes.py +0 -0
  590. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_fleet_health_snapshot.py +0 -0
  591. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_forge_availability.py +0 -0
  592. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_freshness.py +0 -0
  593. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gate_a.py +0 -0
  594. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gate_b.py +0 -0
  595. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gate_snapshot_staleness.py +0 -0
  596. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gates.py +0 -0
  597. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  598. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gen_mock_index.py +0 -0
  599. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_generated_types_fixture.py +0 -0
  600. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_github_ops.py +0 -0
  601. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_goal.py +0 -0
  602. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_graph_health.py +0 -0
  603. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_graph_selfheal_absent_2237.py +0 -0
  604. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_handoff.py +0 -0
  605. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_checks.py +0 -0
  606. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_cli.py +0 -0
  607. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_cli_graph.py +0 -0
  608. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_config.py +0 -0
  609. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_context.py +0 -0
  610. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_coord_web_ci_pin.py +0 -0
  611. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_deploy_lane_facts.py +0 -0
  612. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_incident_regression.py +0 -0
  613. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_pypi.py +0 -0
  614. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_registry.py +0 -0
  615. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_timer_active.py +0 -0
  616. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_toolchain.py +0 -0
  617. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_unit_drift.py +0 -0
  618. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_unit_enablement.py +0 -0
  619. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_hooks.py +0 -0
  620. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_human_attended_437.py +0 -0
  621. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_init.py +0 -0
  622. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_integration.py +0 -0
  623. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_briefing_echo.py +0 -0
  624. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_prefill_state.py +0 -0
  625. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_session_relaunch.py +0 -0
  626. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_test_verdict_backstop.py +0 -0
  627. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_token_attribution.py +0 -0
  628. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_worktree.py +0 -0
  629. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_issue_store_seam.py +0 -0
  630. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_liveness_auditor.py +0 -0
  631. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_liveness_notify.py +0 -0
  632. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_machine_pause.py +0 -0
  633. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_merge_queue.py +0 -0
  634. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_merge_verify.py +0 -0
  635. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_milestone_chat.py +0 -0
  636. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_milestone_dispatch.py +0 -0
  637. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_milestone_gate.py +0 -0
  638. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_milestone_order.py +0 -0
  639. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_milestone_seam.py +0 -0
  640. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_mock_author.py +0 -0
  641. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_model_tiering.py +0 -0
  642. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_models.py +0 -0
  643. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_models_config_labels.py +0 -0
  644. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_needs_attention.py +0 -0
  645. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_network.py +0 -0
  646. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_new_issue_chat.py +0 -0
  647. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_next_release_tag.py +0 -0
  648. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_node_shim.py +0 -0
  649. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_baseline.py +0 -0
  650. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_cli.py +0 -0
  651. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_collect.py +0 -0
  652. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_config.py +0 -0
  653. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_drive_seam.py +0 -0
  654. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_isolation.py +0 -0
  655. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_predicate.py +0 -0
  656. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_quiet_hours.py +0 -0
  657. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_service.py +0 -0
  658. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notify.py +0 -0
  659. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notify_drain.py +0 -0
  660. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_openapi.py +0 -0
  661. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_operational_defaults.py +0 -0
  662. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_overlap_fence.py +0 -0
  663. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_overlap_predict.py +0 -0
  664. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_packaged_deploy_units.py +0 -0
  665. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_parentage.py +0 -0
  666. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_paste_landed.py +0 -0
  667. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_pipeline.py +0 -0
  668. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_plan_followup_approve_plan_command.py +0 -0
  669. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_plan_followup_pr_command.py +0 -0
  670. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_plan_followup_review_command.py +0 -0
  671. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_plan_only.py +0 -0
  672. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_plan_parser.py +0 -0
  673. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_platform_paths.py +0 -0
  674. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_portal_bridge.py +0 -0
  675. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_portal_config.py +0 -0
  676. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_portal_store.py +0 -0
  677. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_portal_sync.py +0 -0
  678. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_pr_body_lint.py +0 -0
  679. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_prereqs.py +0 -0
  680. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_production_db_guard.py +0 -0
  681. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_progress.py +0 -0
  682. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_provider_seam.py +0 -0
  683. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_providers.py +0 -0
  684. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_providers_config_labels.py +0 -0
  685. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_providers_pty.py +0 -0
  686. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_quiet_hours.py +0 -0
  687. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_quiet_hours_store_2146.py +0 -0
  688. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reap_merged_sessions.py +0 -0
  689. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reap_stale_interactive_tick.py +0 -0
  690. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile.py +0 -0
  691. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_branch.py +0 -0
  692. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_completions.py +0 -0
  693. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_merges.py +0 -0
  694. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_tick.py +0 -0
  695. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_usage_limit_done.py +0 -0
  696. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_refine_chat.py +0 -0
  697. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_cordon_2101.py +0 -0
  698. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  699. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_cordon_deadlock_2240.py +0 -0
  700. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_cordon_stuck_2490.py +0 -0
  701. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_propagate.py +0 -0
  702. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_unified_1242.py +0 -0
  703. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_verify.py +0 -0
  704. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_window.py +0 -0
  705. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_remote_auto_prune.py +0 -0
  706. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_remote_interactive_reaper.py +0 -0
  707. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_repo_edit_2220.py +0 -0
  708. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_repo_graph_fleet_2237.py +0 -0
  709. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_repo_onboard_2220.py +0 -0
  710. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_report_result_push.py +0 -0
  711. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reports.py +0 -0
  712. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_retry.py +0 -0
  713. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_retry_advisory_1606.py +0 -0
  714. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_retry_type_1636.py +0 -0
  715. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_revalidate.py +0 -0
  716. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review.py +0 -0
  717. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_end_review_without_verdict.py +0 -0
  718. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_parse_failure_diagnostic.py +0 -0
  719. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_reaffirm.py +0 -0
  720. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_state.py +0 -0
  721. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_verdict_backstop.py +0 -0
  722. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_verdict_override_audit.py +0 -0
  723. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_verdict_relay.py +0 -0
  724. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_zero_commits.py +0 -0
  725. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_scoped_review_wiring.py +0 -0
  726. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_scorecard.py +0 -0
  727. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_self_health.py +0 -0
  728. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_serve.py +0 -0
  729. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_serve_app_board_trim.py +0 -0
  730. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_session.py +0 -0
  731. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_slice_issue_attribution.py +0 -0
  732. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_smoke.py +0 -0
  733. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_smoke_live_checkout_restore.py +0 -0
  734. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_smoke_workflow.py +0 -0
  735. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_spend_ceiling.py +0 -0
  736. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_spend_ceiling_coordinator.py +0 -0
  737. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_split.py +0 -0
  738. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_split_work.py +0 -0
  739. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_stage_projection.py +0 -0
  740. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_stalled_pipeline.py +0 -0
  741. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_state.py +0 -0
  742. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_state_review_findings_daemon.py +0 -0
  743. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_status_fleet_footer.py +0 -0
  744. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_stop_1567.py +0 -0
  745. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_stuck.py +0 -0
  746. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_terminal_command.py +0 -0
  747. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_chat.py +0 -0
  748. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_orchestrator.py +0 -0
  749. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_report.py +0 -0
  750. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_verdict_parsing.py +0 -0
  751. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_verdict_transcript_floor.py +0 -0
  752. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_thin_client_board_audit.py +0 -0
  753. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_thin_client_config_load_1080.py +0 -0
  754. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_thin_client_daemon_routing_906.py +0 -0
  755. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_tmux_host.py +0 -0
  756. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_tmux_session.py +0 -0
  757. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_transcript_floor.py +0 -0
  758. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_usage.py +0 -0
  759. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_usage_limits.py +0 -0
  760. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_usage_rollup.py +0 -0
  761. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_venv_live_install_2121.py +0 -0
  762. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_version_single_source.py +0 -0
  763. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_watch.py +0 -0
  764. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  765. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worker_events.py +0 -0
  766. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worker_image_pin_sync.py +0 -0
  767. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worker_safety.py +0 -0
  768. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worker_test_scoping.py +0 -0
  769. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worktree.py +0 -0
  770. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  771. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/Cargo.lock +0 -0
  772. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/Cargo.toml +0 -0
  773. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/cargo-config-local-quadraui.toml.example +0 -0
  774. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/approved.rs +0 -0
  775. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/audit.rs +0 -0
  776. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/chat.rs +0 -0
  777. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/data.rs +0 -0
  778. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/dialogs.rs +0 -0
  779. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/doc_tabs.rs +0 -0
  780. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/drive.rs +0 -0
  781. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/drive_queue.rs +0 -0
  782. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/escalation.rs +0 -0
  783. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/events.rs +0 -0
  784. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/fixtures.rs +0 -0
  785. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/fleet_health.rs +0 -0
  786. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/fleet_sessions.rs +0 -0
  787. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/fleet_terminals.rs +0 -0
  788. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/format.rs +0 -0
  789. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/milestone_dag.rs +0 -0
  790. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/mod.rs +0 -0
  791. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/msv.rs +0 -0
  792. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/pipeline.rs +0 -0
  793. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/plans.rs +0 -0
  794. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/render.rs +0 -0
  795. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/reports.rs +0 -0
  796. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/sessions.rs +0 -0
  797. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/settings_ui.rs +0 -0
  798. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/sidebar.rs +0 -0
  799. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/terminal.rs +0 -0
  800. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/tests.rs +0 -0
  801. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/types.rs +0 -0
  802. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/workspace.rs +0 -0
  803. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/bin/gtk.rs +0 -0
  804. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/commands.rs +0 -0
  805. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/lib.rs +0 -0
  806. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/main.rs +0 -0
  807. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/settings.rs +0 -0
  808. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/tests/acceptance.rs +0 -0
  809. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/tests/cli.rs +0 -0
  810. {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/tests/fixtures/board_sample.json +0 -0
@@ -201,6 +201,18 @@ The operator-side counterparts to these rules (dispatch economics, what to send
201
201
  versus keep in the coordinator session) are in
202
202
  [`docs/COST_DISCIPLINE.md`](docs/COST_DISCIPLINE.md).
203
203
 
204
+ ## Rules for the coordinator session
205
+
206
+ - **Prefer `coord issue` / `coord repo` / `coord milestone` over raw `gh`.** Workers can't reach
207
+ `gh` at all (deny-listed, above); an interactive coordinator session technically can, but should
208
+ still route issue/PR/milestone reads and writes through the `coord` seam wherever a subcommand
209
+ covers it — that's what keeps the backend-agnostic forge seam
210
+ ([`docs/FORGE_MIGRATION.md`](docs/FORGE_MIGRATION.md)) actually exercised instead of quietly
211
+ bypassed by the one class of session most likely to reach for `gh` out of habit. Where no `coord`
212
+ subcommand covers what's needed — a real gap as of 2026-08 (e.g. #2484: `coord issue` has no
213
+ `list`/`view`) — falling back to `gh` for that one read is fine, but say so and treat it as a gap
214
+ to flag or file, not a silent workaround.
215
+
204
216
  ## Testing — black-box coverage is the acceptance bar
205
217
 
206
218
  **Every PR that changes user-visible behavior must ship a black-box test** that drives the *running app* and asserts on its rendered output — not just unit tests on internal functions. The adversarial reviewer reads this file and **rejects behavior-changing PRs that lack one** (pure refactors / internal-only changes are exempt — say so in the PR if that applies). Build the **harness once per repo**; add **tests incrementally, one (or a few) per behavior-changing issue** — do *not* big-bang a full suite. Coverage then grows with churn and ratchets up (PRs add coverage, never remove it). Keep a thin **core smoke set** over the few most-trafficked screens so critical flows stay guarded even by unrelated changes.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.225
3
+ Version: 0.5.227
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.225
3
+ Version: 0.5.227
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.225",
2
+ "tag": "0.5.227",
3
3
  "distance": 0,
4
- "node": "g58cb8cb15dcd2273e9500a56722b2430b3601848",
4
+ "node": "g4d72834d6806b7c52ef9e25a887a4ddd33fc5427",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-22"
@@ -203,6 +203,7 @@ def reconcile_completed_assignments(
203
203
  agent_status_fn=_query_agent,
204
204
  update_state_fn=None,
205
205
  capture_plan: bool = True,
206
+ commits_ahead_fn=None,
206
207
  ) -> list[dict]:
207
208
  """Dispatch-free passive completion reconcile (#625).
208
209
 
@@ -275,9 +276,22 @@ def reconcile_completed_assignments(
275
276
  The fix is a positive disproof: ``/status`` carries both ``active`` and
276
277
  ``completed``, and an id in NEITHER is a statement about the agent's state,
277
278
  not an inference from its silence. Those — and only those — are
278
- reconciled, to ``failed`` (never ``done``) with :data:`NO_AGENT_RECORD_
279
- REASON`. See :func:`agent_has_no_record` and
280
- :func:`_reconcile_no_agent_record`.
279
+ reconciled, never to ``done``, with :data:`NO_AGENT_RECORD_REASON`. See
280
+ :func:`agent_has_no_record` and :func:`_reconcile_no_agent_record`.
281
+
282
+ **#2553 — "the agent forgot" is not "the work is gone".** The arm above
283
+ used to record ``failed`` unconditionally, but "the agent has no record"
284
+ is evidence about the agent's memory, not about the work: a
285
+ :data:`~coord.models.WORK_LIKE_TYPES` row's own ``branch`` is the one
286
+ artifact in this path that survives an agent restart, a machine reboot,
287
+ and the 25-entry completion-history cap, and the board row already has
288
+ its name. :func:`_reconcile_no_agent_record` now consults it
289
+ (``commits_ahead_fn``, defaulting to :func:`coord.github_ops.
290
+ branch_commits_ahead_for_assignment`) before choosing ``failed`` — a
291
+ branch with real commits ahead of its base lands on ``advisory`` instead
292
+ (work exists, provenance unverified, needs a human or a verify pass),
293
+ naming the branch in the reason so an operator doesn't have to go
294
+ spelunking for it.
281
295
 
282
296
  Three guards, because **this arm reaps** and #1658 is what getting that
283
297
  wrong looks like in production:
@@ -301,6 +315,12 @@ def reconcile_completed_assignments(
301
315
  #1421's handler) — and there the workers really are gone, so reconciling
302
316
  every row on that machine is the correct answer rather than an accident.
303
317
 
318
+ ``commits_ahead_fn`` (#2553) is the injectable seam for the branch check
319
+ above — ``fn(assignment, config) -> int | None`` — defaulting to
320
+ :func:`coord.github_ops.branch_commits_ahead_for_assignment`. Tests stub
321
+ it to avoid a real ``gh`` call, exactly like ``agent_status_fn`` stubs the
322
+ real agent poll.
323
+
304
324
  Returns one dict per reconciled assignment (empty when nothing changed).
305
325
  """
306
326
  if update_state_fn is None:
@@ -308,6 +328,11 @@ def reconcile_completed_assignments(
308
328
 
309
329
  update_state_fn = _update_local_state
310
330
 
331
+ if commits_ahead_fn is None:
332
+ from coord import github_ops # noqa: PLC0415
333
+
334
+ commits_ahead_fn = github_ops.branch_commits_ahead_for_assignment
335
+
311
336
  if board is None:
312
337
  from coord.state import build_board # noqa: PLC0415
313
338
 
@@ -352,7 +377,10 @@ def reconcile_completed_assignments(
352
377
  and not is_attended_session(a)
353
378
  and _no_record_grace_elapsed(a)
354
379
  ):
355
- _reconcile_no_agent_record(a, aid, update_state_fn, reconciled)
380
+ _reconcile_no_agent_record(
381
+ a, aid, update_state_fn, reconciled,
382
+ config=config, commits_ahead_fn=commits_ahead_fn,
383
+ )
356
384
  continue
357
385
  # #1534: `effective_agent_status` refuses an agent-reported `done`
358
386
  # that also carries a usage-limit-kill reason — the daemon's passive
@@ -516,49 +544,123 @@ def reconcile_completed_assignments(
516
544
  return reconciled
517
545
 
518
546
 
547
+ def _no_agent_record_branch_reason(branch: str, ahead: int) -> str:
548
+ """#2553's operator-facing reason for the "work is on the branch" half.
549
+
550
+ Distinct from :data:`NO_AGENT_RECORD_REASON` (the "nothing was pushed"
551
+ half) precisely so the two are told apart at a glance — the acceptance
552
+ bar for #2553 is that the reason NAMES the branch rather than making an
553
+ operator go looking for it, since that branch is the whole point: it is
554
+ the one artifact of this leg that survived the agent's amnesia.
555
+ """
556
+ return (
557
+ "agent has no record of this assignment (present in neither its "
558
+ "/status `active` nor `completed` list), but its branch "
559
+ f"`{branch}` has {ahead} commit(s) ahead of its base — the worker "
560
+ "pushed real work before the agent's record of it was lost. "
561
+ "Provenance is unverified (no worker ever reported a verdict), so "
562
+ "this is recorded as advisory rather than failed: it needs a human "
563
+ "or a verify pass, not to be discarded (#2553)"
564
+ )
565
+
566
+
519
567
  def _reconcile_no_agent_record(
520
568
  a: Assignment,
521
569
  aid: str,
522
570
  update_state_fn,
523
571
  reconciled: list[dict],
572
+ *,
573
+ config: Config,
574
+ commits_ahead_fn,
524
575
  ) -> None:
525
- """#2275: flip a ``running`` row the agent has no record of to ``failed``.
576
+ """#2275: flip a ``running`` row the agent has no record of to a terminal
577
+ status — ``failed`` by default, or ``advisory`` when #2553's branch check
578
+ below finds the row's own branch outlived the agent's amnesia.
526
579
 
527
580
  Called from :func:`reconcile_completed_assignments` only, and only once
528
581
  all three guards there have passed (positive disproof, not attended, past
529
582
  the grace window).
530
583
 
531
- **``failed``, never ``done``.** This leg never reported a verdict, so the
532
- one thing that must not happen is a silent flip to ``done`` that
533
- manufactures a pass and every downstream gate (review dispatch, the
534
- acceptance gate, the merge queue) then behaves as if a slice exists that
535
- nobody ever produced. A stall is bad; a manufactured pass is worse.
536
- ``failure_reason`` is the pinned :data:`NO_AGENT_RECORD_REASON`, so
537
- ``coord status``/the TUI/``coord drive`` all name the cause rather than
538
- showing a failure with no explanation.
539
-
540
- ``exit_code`` is deliberately left ``None``: there is no reap, so there is
541
- no exit code, and writing a fake one would be the same class of lie as
542
- writing ``done``.
584
+ **Never ``done``.** This leg never reported a verdict, so the one thing
585
+ that must not happen regardless of which terminal status below fires
586
+ is a silent flip to ``done``: that manufactures a pass and every
587
+ downstream gate (review dispatch, the acceptance gate, the merge queue)
588
+ then behaves as if a slice exists that nobody ever produced. A stall is
589
+ bad; a manufactured pass is worse.
590
+
591
+ **#2553 "the agent forgot" is evidence about the agent, not the work.**
592
+ Before this, every row reaching here was unconditionally recorded
593
+ ``failed`` with :data:`NO_AGENT_RECORD_REASON`, even when the row's own
594
+ ``branch`` carried real, pushed commits stranding that work with no
595
+ second chance (most visible on ``test-author``, whose sealed-path rule
596
+ means nothing else will ever pick the branch back up; see
597
+ claude-coordinator#2553, ``coord-portal``#129 assignment
598
+ ``c2120f7206ec``). The branch is the one artifact in this whole path
599
+ that survives an agent restart, a machine reboot, and the 25-entry
600
+ completion-history cap, and the board row already names it — so this now
601
+ asks it directly via ``commits_ahead_fn(a, config)`` before choosing:
602
+
603
+ * Only for :data:`~coord.models.WORK_LIKE_TYPES` (``work``,
604
+ ``mock-author``, ``test-author``) — the types whose ``a.branch`` holds
605
+ commits THIS row itself produced. A ``smoke``/``review`` row's
606
+ ``branch`` is inherited verbatim from the work it rides on (e.g.
607
+ ``coord.smoke.dispatch_pending_smoke`` stamps
608
+ ``branch=completed.branch``), so "commits ahead of base" there would
609
+ just be re-discovering the PARENT's diff, not anything this leg
610
+ produced — checking it would misfire the #2208 smoke path (a dead Test
611
+ leg on an already-green branch) into ``advisory`` instead of the
612
+ environmental clear it needs.
613
+ * A positive, known commit count (``ahead`` a plain ``int > 0``) is the
614
+ only thing that moves the needle, to ``advisory`` with
615
+ :func:`_no_agent_record_branch_reason` (which names the branch).
616
+ Anything else — no branch, a non-``WORK_LIKE_TYPES`` row, ``ahead ==
617
+ 0``, or ``ahead is None`` (unknown: the repo isn't in ``config``, the
618
+ remote call failed, ...) — keeps the pre-#2553 behaviour: ``failed``
619
+ with :data:`NO_AGENT_RECORD_REASON`. Unknown fails CLOSED toward
620
+ ``failed`` rather than guessing ``advisory``, matching this arm's
621
+ existing polarity: a stall is recoverable, a manufactured verdict of
622
+ either kind is not the thing to guess at.
623
+ * ``commits_ahead_fn`` is called defensively — a network hiccup querying
624
+ the remote must not crash the passive daemon tick any more than an
625
+ unreachable agent does elsewhere in this module.
626
+
627
+ ``exit_code`` is deliberately left ``None`` in both cases: there is no
628
+ reap, so there is no exit code, and writing a fake one would be the same
629
+ class of lie as writing ``done``.
543
630
 
544
631
  Kept passive, per this module's #1616 contract — it writes state through
545
- the same ``update_state_fn`` seam and dispatches nothing. The ONE thing
546
- it does beyond the write is the #1605 Test-stage propagation, which is not
547
- a new side effect: it is the same call the ordinary ``terminal ==
548
- "failed"`` path already makes, and skipping it would leave the parent
549
- work row's ``test_state="running"`` forever i.e. it would fix half of
550
- #2208 and leave the other half stranded.
632
+ the same ``update_state_fn`` seam and dispatches nothing. The commits-
633
+ ahead check is a read, not a mutation, and it decides between two
634
+ non-dispatching terminal states it does not advance the pipeline any
635
+ more than the write itself does. The #1605 Test-stage propagation below
636
+ is not a new side effect either: it is the same call the ordinary
637
+ ``terminal == "failed"`` path already makes, and skipping it would leave
638
+ the parent work row's ``test_state="running"`` forever — i.e. it would
639
+ fix half of #2208 and leave the other half stranded.
551
640
  """
641
+ terminal_status = "failed"
642
+ reason = NO_AGENT_RECORD_REASON
643
+ branch = (a.branch or "").strip()
644
+
645
+ if branch and a.type in WORK_LIKE_TYPES:
646
+ try:
647
+ ahead = commits_ahead_fn(a, config)
648
+ except Exception: # noqa: BLE001 — best-effort; unknown → failed below
649
+ ahead = None
650
+ if isinstance(ahead, int) and not isinstance(ahead, bool) and ahead > 0:
651
+ terminal_status = "advisory"
652
+ reason = _no_agent_record_branch_reason(branch, ahead)
653
+
552
654
  update_state_fn(
553
655
  assignment_id=aid,
554
- terminal_status="failed",
656
+ terminal_status=terminal_status,
555
657
  branch=a.branch,
556
658
  review_state=None,
557
- failure_reason=NO_AGENT_RECORD_REASON,
659
+ failure_reason=reason,
558
660
  exit_code=None,
559
661
  )
560
662
 
561
- if a.type == "smoke":
663
+ if a.type == "smoke" and terminal_status == "failed":
562
664
  # #2275: environmental by construction, so state it rather than
563
665
  # letting `classify_failure` guess. `NO_AGENT_RECORD_REASON` is
564
666
  # coordinator-authored prose with no wire token in it, so the
@@ -569,9 +671,12 @@ def _reconcile_no_agent_record(
569
671
  # vanished worker is the machine's fault, not the work's; clearing
570
672
  # the verdict lets `dispatch_pending_smoke` re-run the Test stage on
571
673
  # its next tick, which is exactly what a human did in 14 minutes.
674
+ # (`terminal_status` is always "failed" for `smoke` in practice — the
675
+ # branch check above only ever fires for WORK_LIKE_TYPES — but the
676
+ # guard keeps this correct even if that scoping ever changes.)
572
677
  propagate_smoke_terminal_failure(
573
678
  parent_assignment_id=a.review_of_assignment_id,
574
- failure_reason=NO_AGENT_RECORD_REASON,
679
+ failure_reason=reason,
575
680
  environmental=True,
576
681
  )
577
682
 
@@ -581,9 +686,9 @@ def _reconcile_no_agent_record(
581
686
  "issue_number": a.issue_number,
582
687
  "repo": a.repo_name,
583
688
  "type": a.type,
584
- "to_status": "failed",
689
+ "to_status": terminal_status,
585
690
  "plan_captured": False,
586
- "reason": NO_AGENT_RECORD_REASON,
691
+ "reason": reason,
587
692
  }
588
693
  )
589
694
 
@@ -247,6 +247,7 @@ def build_test_author_briefing(
247
247
  issue_body: str | None,
248
248
  driver_entrypoint: str = "",
249
249
  driver_mock: str = "",
250
+ default_branch: str = "main",
250
251
  ) -> str:
251
252
  """Compose the test-author's briefing (its first/only user message).
252
253
 
@@ -255,6 +256,16 @@ def build_test_author_briefing(
255
256
  None) authors the full initial suite from the contract; *JIT mode*
256
257
  (`issue_number` set) extends just that issue's slice.
257
258
 
259
+ *default_branch* (#2539) is the repo's merge target (``repo_cfg.
260
+ default_branch or "main"`` at both call sites, the same value already
261
+ sent as the dispatch payload's ``branch`` field). JIT mode uses it to
262
+ tell the author to check this branch's mergeability before finishing —
263
+ a re-dispatch onto an already-authored slice branch (see the #2552
264
+ RESUMING note appended by `dispatch_test_author`) previously had no
265
+ instruction to look at `default_branch` at all, so a slice that had
266
+ gone stale behind a sibling slice's merge would report done with an
267
+ unresolved conflict still sitting on the PR (coord-portal#132).
268
+
258
269
  *driver_entrypoint* (#1552) is the driver's declared ``entrypoint:`` —
259
270
  the crate root a slice must be registered in before the run command can
260
271
  see it, for a framework that links tests through an entry point rather
@@ -346,6 +357,43 @@ def build_test_author_briefing(
346
357
  parts.append("")
347
358
  parts.append(f"ISSUE #{issue_number}: {issue_title or '(no title)'}")
348
359
  parts.append(issue_body.strip() if issue_body and issue_body.strip() else "(no body)")
360
+ parts.append("")
361
+ parts.append(
362
+ f"MERGEABILITY (#2539): before you finish — after step 4b's "
363
+ f"manifest update, before step 6's commit/push — fetch "
364
+ f"`{default_branch}` (`git fetch origin {default_branch}`) and "
365
+ f"check whether this branch still merges onto it cleanly (e.g. "
366
+ f"`git merge --no-commit --no-ff origin/{default_branch}`, then "
367
+ "`git merge --abort` once you've seen the result — never leave "
368
+ "the worktree mid-merge). This branch may already carry commits "
369
+ "from a prior dispatch (see any note above about resuming "
370
+ "unfinished work), and a sibling slice's PR may have merged "
371
+ f"into `{default_branch}` since this one was authored. If it "
372
+ "merges clean, proceed to commit/push as normal. If it "
373
+ "conflicts:\n"
374
+ f" - Confined to `{ACCEPTANCE_DIRNAME}/{ms_dir}/**` (the sealed "
375
+ "suite YOU already have authoring rights over) AND a clean "
376
+ "additive collision — the common case is two slices each "
377
+ "appending their own block to the shared "
378
+ "`manifest.(yml|json)` (that file documents its own "
379
+ "convention: later slices MERGE into it) — resolve it "
380
+ f"yourself: rebase onto `origin/{default_branch}` and keep BOTH "
381
+ "sides' additions, never dropping the other slice's entries to "
382
+ "make yours resolve. Re-run step 4's red-check afterward — a "
383
+ "rebase can shift what the tests see underneath them.\n"
384
+ " - Anything else — a conflict that reaches outside "
385
+ f"`{ACCEPTANCE_DIRNAME}/{ms_dir}/**`, or isn't a clean additive "
386
+ "collision — do NOT guess a resolution. Abort the merge/rebase, "
387
+ "leave the branch as it was, and STOP with:\n"
388
+ f" STUCK: merge conflict against {default_branch} in "
389
+ "<file(s)> — outside sealed-authoring scope or not a clean "
390
+ "additive merge\n"
391
+ "(same posture a `conflict-fix` session takes for a "
392
+ "non-rebaseable conflict — you are simply the only dispatch "
393
+ f"type structurally allowed to touch `{ACCEPTANCE_DIRNAME}/` "
394
+ "at all, so a conflict confined there is yours to resolve, not "
395
+ "conflict-fix's)."
396
+ )
349
397
 
350
398
  parts.append("")
351
399
  parts.append("---")
@@ -499,6 +547,7 @@ def dispatch_test_author(
499
547
  issue_number=issue_number,
500
548
  issue_title=issue_title,
501
549
  issue_body=issue_body,
550
+ default_branch=repo_cfg.default_branch or "main",
502
551
  )
503
552
 
504
553
  # #1171: milestone-mode dispatches (issue_number is None) keep a single
@@ -889,6 +938,7 @@ def dispatch_test_author_interactive(
889
938
  issue_number=issue_number,
890
939
  issue_title=issue_title,
891
940
  issue_body=issue_body,
941
+ default_branch=repo_cfg.default_branch or "main",
892
942
  )
893
943
 
894
944
  # Same FIXED title as the headless dispatch (see dispatch_test_author's
@@ -2557,6 +2557,12 @@ def test_a_dead_end_exit_code_reaches_the_drive_exited_audit_row(
2557
2557
  monkeypatch.setattr(
2558
2558
  "coord.drive.Driver._post_escalation_comment", lambda *a, **kw: None
2559
2559
  )
2560
+ # Pin `coord_argv()`'s prefix to a single element so the `c[1:3]` slice
2561
+ # below is decided by the code under test, not by whether `coord` is on
2562
+ # the *host's* $PATH (#2564) — off-PATH, `coord_argv()`'s documented
2563
+ # fallback is `[sys.executable, "-m", "coord.cli"]`, three elements, which
2564
+ # shifts every recorded argv's ["escalate", "record"] out of [1:3].
2565
+ monkeypatch.setenv("COORD_DRIVE_COORD_BIN", "coord")
2560
2566
  payload = board(status="done", test_state="passed")
2561
2567
  payload["assignments"].append({
2562
2568
  "repo_name": REPO,
@@ -23,6 +23,8 @@ import subprocess
23
23
  import time
24
24
  from pathlib import Path
25
25
 
26
+ import pytest
27
+
26
28
  from coord.config import Config
27
29
  from coord.models import Assignment, Board, Machine, Repo
28
30
  from coord.reconcile import (
@@ -33,6 +35,26 @@ from coord.reconcile import (
33
35
  )
34
36
 
35
37
 
38
+ @pytest.fixture(autouse=True)
39
+ def _no_real_gh_calls(monkeypatch: pytest.MonkeyPatch) -> None:
40
+ """Safety net for #2553's branch check: every test in this module either
41
+ doesn't reach `_reconcile_no_agent_record`'s branch check at all, or
42
+ passes its own `commits_ahead_fn` stub. If a future test reaches it
43
+ without stubbing, this fails loudly instead of silently shelling out to
44
+ a real `gh` for a repo (`acme/cc`) that doesn't exist."""
45
+
46
+ def _boom(*_a, **_kw): # pragma: no cover - only runs on regression
47
+ raise AssertionError(
48
+ "a test reached the real github_ops.branch_commits_ahead_for_"
49
+ "assignment default — pass commits_ahead_fn= explicitly instead "
50
+ "of hitting the network from a unit test"
51
+ )
52
+
53
+ monkeypatch.setattr(
54
+ "coord.github_ops.branch_commits_ahead_for_assignment", _boom
55
+ )
56
+
57
+
36
58
  def _config() -> Config:
37
59
  return Config(
38
60
  repos=[Repo(name="cc", github="acme/cc")],
@@ -97,6 +119,14 @@ def _status(*, active: list[dict] | None = None, completed: list[dict] | None =
97
119
  return {"active": list(active or []), "completed": list(completed or [])}
98
120
 
99
121
 
122
+ def _zero_ahead(*_a, **_kw) -> int:
123
+ """Stub `commits_ahead_fn` (#2553): "nothing pushed" — the pre-#2553
124
+ default. Passed explicitly by every test below that doesn't itself
125
+ exercise the branch-has-work half, so the no-record arm never shells out
126
+ to a real `gh` for a repo (`acme/cc`) that doesn't exist."""
127
+ return 0
128
+
129
+
100
130
  # ── the fix ────────────────────────────────────────────────────────────────
101
131
 
102
132
 
@@ -113,6 +143,7 @@ def test_row_in_neither_list_is_reconciled_to_failed_with_pinned_reason() -> Non
113
143
  ),
114
144
  update_state_fn=rec,
115
145
  capture_plan=False,
146
+ commits_ahead_fn=_zero_ahead,
116
147
  )
117
148
 
118
149
  assert len(rec.calls) == 1
@@ -158,6 +189,7 @@ def test_never_flips_to_done() -> None:
158
189
  agent_status_fn=lambda host: _status(),
159
190
  update_state_fn=rec,
160
191
  capture_plan=False,
192
+ commits_ahead_fn=_zero_ahead,
161
193
  )
162
194
  assert [c["terminal_status"] for c in rec.calls] == ["failed", "failed", "failed"]
163
195
 
@@ -176,6 +208,7 @@ def test_empty_agent_reconciles_every_row_on_that_machine() -> None:
176
208
  agent_status_fn=lambda host: _status(),
177
209
  update_state_fn=rec,
178
210
  capture_plan=False,
211
+ commits_ahead_fn=_zero_ahead,
179
212
  )
180
213
  assert {c["assignment_id"] for c in rec.calls} == {"a1", "a2", "a3"}
181
214
  assert len(out) == 3
@@ -210,6 +243,147 @@ def test_restart_recovered_row_takes_the_ordinary_path_not_the_no_record_arm() -
210
243
  assert rec.calls[0]["exit_code"] == 1
211
244
 
212
245
 
246
+ # ── #2553: consult the row's own branch before guessing `failed` ───────────
247
+ #
248
+ # coord-portal#129, assignment c2120f7206ec: a `test-author` leg pushed 948
249
+ # lines to `test-author-ms-4-slice-129` and then the agent forgot about it.
250
+ # The no-record arm recorded `failed` without ever looking at the branch it
251
+ # was already holding the name of, stranding real work behind a sealed path
252
+ # nothing else would ever pick back up.
253
+
254
+
255
+ def test_branch_with_pushed_commits_is_advisory_not_failed() -> None:
256
+ """Acceptance half 1: agent forgot, but the branch has commits ahead of
257
+ its base → `advisory`, not `failed` — the work must not be discarded."""
258
+ rec = _Recorder()
259
+ out = reconcile_completed_assignments(
260
+ _config(),
261
+ board=_board(_running("ta1", atype="test-author", branch="test-author-ms-4-slice-129")),
262
+ agent_status_fn=lambda host: _status(),
263
+ update_state_fn=rec,
264
+ capture_plan=False,
265
+ commits_ahead_fn=lambda a, cfg: 11,
266
+ )
267
+
268
+ assert len(rec.calls) == 1
269
+ assert rec.calls[0]["terminal_status"] == "advisory"
270
+ assert rec.calls[0]["branch"] == "test-author-ms-4-slice-129"
271
+ assert rec.calls[0]["exit_code"] is None
272
+ reason = rec.calls[0]["failure_reason"]
273
+ assert reason != NO_AGENT_RECORD_REASON
274
+ # The operator-facing reason must name the branch — that's the whole
275
+ # acceptance bar: an operator reading `coord status` shouldn't have to
276
+ # go spelunking for which branch carries the stranded work.
277
+ assert "test-author-ms-4-slice-129" in reason
278
+ assert "11" in reason
279
+ assert "#2553" in reason
280
+ assert out[0]["to_status"] == "advisory"
281
+ assert out[0]["reason"] == reason
282
+
283
+
284
+ def test_branch_with_zero_commits_ahead_is_still_failed() -> None:
285
+ """Acceptance half 2: agent forgot, and nothing was ever pushed → the
286
+ pre-#2553 `failed` + pinned reason, unchanged."""
287
+ rec = _Recorder()
288
+ out = reconcile_completed_assignments(
289
+ _config(),
290
+ board=_board(_running("w1", atype="work")),
291
+ agent_status_fn=lambda host: _status(),
292
+ update_state_fn=rec,
293
+ capture_plan=False,
294
+ commits_ahead_fn=lambda a, cfg: 0,
295
+ )
296
+
297
+ assert rec.calls[0]["terminal_status"] == "failed"
298
+ assert rec.calls[0]["failure_reason"] == NO_AGENT_RECORD_REASON
299
+ assert out[0]["to_status"] == "failed"
300
+
301
+
302
+ def test_unknown_commits_ahead_fails_closed_to_failed() -> None:
303
+ """An unconfirmable branch state (network hiccup, unknown repo, ...)
304
+ must not be guessed as `advisory` — that would be manufacturing a
305
+ "provenance unverified" verdict on no evidence at all. Fails closed to
306
+ the pre-#2553 `failed`, matching this arm's existing polarity."""
307
+ rec = _Recorder()
308
+ reconcile_completed_assignments(
309
+ _config(),
310
+ board=_board(_running("w1", atype="work")),
311
+ agent_status_fn=lambda host: _status(),
312
+ update_state_fn=rec,
313
+ capture_plan=False,
314
+ commits_ahead_fn=lambda a, cfg: None,
315
+ )
316
+ assert rec.calls[0]["terminal_status"] == "failed"
317
+ assert rec.calls[0]["failure_reason"] == NO_AGENT_RECORD_REASON
318
+
319
+
320
+ def test_commits_ahead_fn_raising_fails_closed_to_failed() -> None:
321
+ """A network error from the branch check must not crash the passive
322
+ daemon tick — caught and treated as unknown, same as a `None` return."""
323
+ rec = _Recorder()
324
+ reconcile_completed_assignments(
325
+ _config(),
326
+ board=_board(_running("w1", atype="work")),
327
+ agent_status_fn=lambda host: _status(),
328
+ update_state_fn=rec,
329
+ capture_plan=False,
330
+ commits_ahead_fn=lambda a, cfg: (_ for _ in ()).throw(RuntimeError("boom")),
331
+ )
332
+ assert rec.calls[0]["terminal_status"] == "failed"
333
+ assert rec.calls[0]["failure_reason"] == NO_AGENT_RECORD_REASON
334
+
335
+
336
+ def test_branch_check_is_scoped_to_work_like_types() -> None:
337
+ """A `smoke`/`review` row's `branch` is inherited verbatim from the work
338
+ it rides on (see `coord.smoke.dispatch_pending_smoke`), so it is almost
339
+ always "ahead" for reasons that have nothing to do with what THIS leg
340
+ produced. The branch check must not run for these types — checked here
341
+ by making the stub explode if it's ever called for a non-WORK_LIKE_TYPES
342
+ row, which would otherwise misroute the #2208 smoke path into
343
+ `advisory` instead of its environmental `failed` clear."""
344
+
345
+ def _boom(a, cfg): # pragma: no cover - only runs on regression
346
+ raise AssertionError(
347
+ f"commits_ahead_fn was called for a.type={a.type!r}, which is "
348
+ "not in WORK_LIKE_TYPES"
349
+ )
350
+
351
+ rec = _Recorder()
352
+ out = reconcile_completed_assignments(
353
+ _config(),
354
+ board=_board(
355
+ _running("smoke-1", atype="smoke", review_of="work-1"),
356
+ _running("review-1", atype="review"),
357
+ ),
358
+ agent_status_fn=lambda host: _status(),
359
+ update_state_fn=rec,
360
+ capture_plan=False,
361
+ commits_ahead_fn=_boom,
362
+ )
363
+ assert [c["terminal_status"] for c in rec.calls] == ["failed", "failed"]
364
+ assert [o["to_status"] for o in out] == ["failed", "failed"]
365
+
366
+
367
+ def test_no_branch_recorded_is_still_failed() -> None:
368
+ """A row with no branch at all has nothing to consult — straight to the
369
+ pre-#2553 `failed` path without ever calling `commits_ahead_fn`."""
370
+
371
+ def _boom(a, cfg): # pragma: no cover - only runs on regression
372
+ raise AssertionError("commits_ahead_fn was called with no branch")
373
+
374
+ rec = _Recorder()
375
+ reconcile_completed_assignments(
376
+ _config(),
377
+ board=_board(_running("w1", atype="work", branch=None)),
378
+ agent_status_fn=lambda host: _status(),
379
+ update_state_fn=rec,
380
+ capture_plan=False,
381
+ commits_ahead_fn=_boom,
382
+ )
383
+ assert rec.calls[0]["terminal_status"] == "failed"
384
+ assert rec.calls[0]["failure_reason"] == NO_AGENT_RECORD_REASON
385
+
386
+
213
387
  # ── guard rails ────────────────────────────────────────────────────────────
214
388
 
215
389
 
@@ -316,6 +490,7 @@ def test_grace_window_defers_a_just_dispatched_row() -> None:
316
490
  agent_status_fn=lambda host: _status(),
317
491
  update_state_fn=rec,
318
492
  capture_plan=False,
493
+ commits_ahead_fn=_zero_ahead,
319
494
  )
320
495
  assert rec.calls == []
321
496
  assert out == []
@@ -328,6 +503,7 @@ def test_grace_window_defers_a_just_dispatched_row() -> None:
328
503
  agent_status_fn=lambda host: _status(),
329
504
  update_state_fn=rec2,
330
505
  capture_plan=False,
506
+ commits_ahead_fn=_zero_ahead,
331
507
  )
332
508
  assert [c["assignment_id"] for c in rec2.calls] == ["fresh"]
333
509
 
@@ -342,6 +518,7 @@ def test_row_with_no_dispatched_at_is_eligible() -> None:
342
518
  agent_status_fn=lambda host: _status(),
343
519
  update_state_fn=rec,
344
520
  capture_plan=False,
521
+ commits_ahead_fn=_zero_ahead,
345
522
  )
346
523
  assert [c["assignment_id"] for c in rec.calls] == ["nodate"]
347
524
 
@@ -359,7 +536,13 @@ def test_agent_has_no_record_predicate() -> None:
359
536
 
360
537
  def test_arm_stays_passive_no_dispatch_no_github(monkeypatch) -> None:
361
538
  """#1616's contract: this function reflects state, it never advances the
362
- pipeline. The no-record arm must not become the exception."""
539
+ pipeline. The no-record arm must not become the exception.
540
+
541
+ #2553's branch check is a READ (`commits_ahead_fn`), not a mutation, and
542
+ it only decides between two non-dispatching terminal statuses — it does
543
+ not violate this contract, so it is stubbed here (like `agent_status_fn`
544
+ always has been) rather than asserted against. What must still never
545
+ happen is a dispatch (`_reassign`) or a posted comment (`httpx.post`)."""
363
546
  import coord.reconcile as rec_mod
364
547
 
365
548
  def _boom(*a, **kw): # pragma: no cover - only runs on regression
@@ -375,6 +558,7 @@ def test_arm_stays_passive_no_dispatch_no_github(monkeypatch) -> None:
375
558
  agent_status_fn=lambda host: _status(),
376
559
  update_state_fn=rec,
377
560
  capture_plan=False,
561
+ commits_ahead_fn=_zero_ahead,
378
562
  )
379
563
  assert rec.calls[0]["terminal_status"] == "failed"
380
564
 
@@ -526,6 +710,7 @@ def test_history_eviction_end_to_end(tmp_path: Path) -> None:
526
710
  agent_status_fn=lambda host: payload,
527
711
  update_state_fn=rec,
528
712
  capture_plan=False,
713
+ commits_ahead_fn=_zero_ahead,
529
714
  )
530
715
  server.shutdown()
531
716