code-coordinator 0.5.580__tar.gz → 0.5.582__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 (935) hide show
  1. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/comments.py +167 -0
  7. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/github_ops.py +22 -0
  8. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/merge_queue.py +232 -0
  9. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/rest_schema.py +5 -2
  10. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/review.py +29 -2
  11. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/serve_app.py +25 -5
  12. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/state.py +84 -0
  13. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_comments.py +101 -0
  14. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_github_ops.py +33 -0
  15. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_merge_queue.py +81 -33
  16. code_coordinator-0.5.582/tests/test_merge_verification.py +279 -0
  17. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_review.py +39 -0
  18. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_serve.py +42 -0
  19. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_serve_rest_routes.py +36 -0
  20. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_state.py +98 -0
  21. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.claude/commands/board.md +0 -0
  22. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.claude/commands/complete-session.md +0 -0
  23. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.claude/commands/coordinator.md +0 -0
  24. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.githooks/_lib.sh +0 -0
  25. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.githooks/post-checkout +0 -0
  26. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.githooks/post-commit +0 -0
  27. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.githooks/post-merge +0 -0
  28. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  29. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.github/coord-ci-acceptance.yml +0 -0
  30. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.github/workflows/auto-release.yml +0 -0
  31. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.github/workflows/publish.yml +0 -0
  32. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.github/workflows/test.yml +0 -0
  33. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/.gitignore +0 -0
  34. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/CLAUDE.md +0 -0
  35. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/GOAL.md +0 -0
  36. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/LICENSE +0 -0
  37. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/MANIFEST.in +0 -0
  38. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/README.md +0 -0
  39. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/code_coordinator.egg-info/dependency_links.txt +0 -0
  40. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/code_coordinator.egg-info/entry_points.txt +0 -0
  41. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/code_coordinator.egg-info/requires.txt +0 -0
  42. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/code_coordinator.egg-info/top_level.txt +0 -0
  43. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/__init__.py +0 -0
  44. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/_board_mapping.py +0 -0
  45. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/acceptance.py +0 -0
  46. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/acceptance_drivers.py +0 -0
  47. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/agent.py +0 -0
  48. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/agent_app.py +0 -0
  49. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/agent_update.py +0 -0
  50. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/agents/opencode/.gitignore +0 -0
  51. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/agents/opencode/agents/work.md +0 -0
  52. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/agents/opencode/routing.jsonc +0 -0
  53. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/approved_work.py +0 -0
  54. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/audit.py +0 -0
  55. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/auto_loop.py +0 -0
  56. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/backup.py +0 -0
  57. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/block_log.py +0 -0
  58. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/board_schema.py +0 -0
  59. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/board_service.py +0 -0
  60. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/board_wire.py +0 -0
  61. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/brain.py +0 -0
  62. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/branch_model.py +0 -0
  63. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/bug_intake.py +0 -0
  64. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/bugbash.py +0 -0
  65. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/cargo_cache.py +0 -0
  66. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/ci_fix.py +0 -0
  67. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/ci_github.py +0 -0
  68. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/ci_gitlab.py +0 -0
  69. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/ci_store.py +0 -0
  70. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/claim.py +0 -0
  71. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/claude_setup_token.py +0 -0
  72. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/cli.py +0 -0
  73. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/client.py +0 -0
  74. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/codegen.py +0 -0
  75. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/__init__.py +0 -0
  76. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/_common.py +0 -0
  77. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/acceptance.py +0 -0
  78. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/agent_ops.py +0 -0
  79. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/audit.py +0 -0
  80. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/backup.py +0 -0
  81. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/bugbash.py +0 -0
  82. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/chat.py +0 -0
  83. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/ci.py +0 -0
  84. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/codegen.py +0 -0
  85. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/dispatch.py +0 -0
  86. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/dispatch_workers.py +0 -0
  87. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/dr.py +0 -0
  88. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/drive.py +0 -0
  89. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/drive_queue.py +0 -0
  90. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/gate_a.py +0 -0
  91. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/gates.py +0 -0
  92. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/issues.py +0 -0
  93. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/lifecycle.py +0 -0
  94. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/machine.py +0 -0
  95. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/merge.py +0 -0
  96. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/milestone.py +0 -0
  97. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/plan_followup.py +0 -0
  98. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/plans.py +0 -0
  99. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/portal.py +0 -0
  100. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/pr.py +0 -0
  101. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/release.py +0 -0
  102. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/repo.py +0 -0
  103. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/report.py +0 -0
  104. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/review.py +0 -0
  105. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/scorecard.py +0 -0
  106. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/sessions.py +0 -0
  107. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/setup.py +0 -0
  108. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/status.py +0 -0
  109. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/store_migrate.py +0 -0
  110. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/terminal.py +0 -0
  111. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/test_gate.py +0 -0
  112. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/commands/tui.py +0 -0
  113. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/config.py +0 -0
  114. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/config_reload.py +0 -0
  115. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/confirm_test.py +0 -0
  116. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/conflict_fix.py +0 -0
  117. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dao.py +0 -0
  118. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dashboard/__init__.py +0 -0
  119. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dashboard/fixture.py +0 -0
  120. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dashboard/index.html +0 -0
  121. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dashboard/reports.html +0 -0
  122. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dashboard/server.py +0 -0
  123. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dashboard/terminal.py +0 -0
  124. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/db.py +0 -0
  125. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dead_end.py +0 -0
  126. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/decomposition_chat.py +0 -0
  127. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/README.md +0 -0
  128. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-agent.service +0 -0
  129. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-backup.service +0 -0
  130. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-backup.timer +0 -0
  131. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-db-backup.service +0 -0
  132. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-db-backup.sh +0 -0
  133. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-db-backup.timer +0 -0
  134. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-dr-verify.service +0 -0
  135. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-dr-verify.timer +0 -0
  136. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-drive-queue.service +0 -0
  137. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-drive-queue.timer +0 -0
  138. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-failure-notify.service +0 -0
  139. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-fleet-watchdog.service +0 -0
  140. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  141. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-notify.service +0 -0
  142. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-notify.timer +0 -0
  143. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-release-propagate.service +0 -0
  144. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-release-propagate.timer +0 -0
  145. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-release-window.service +0 -0
  146. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-release-window.timer +0 -0
  147. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-serve.service +0 -0
  148. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-web-dist-build.service +0 -0
  149. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-web-dist-build.timer +0 -0
  150. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy/coord-web.service +0 -0
  151. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy_manifest.py +0 -0
  152. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deploy_units.py +0 -0
  153. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deprecation_telemetry.py +0 -0
  154. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/deps.py +0 -0
  155. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/diagnose.py +0 -0
  156. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dirlink.py +0 -0
  157. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dispatch.py +0 -0
  158. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dispatch_liveness.py +0 -0
  159. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dist_name.py +0 -0
  160. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dr_promote.py +0 -0
  161. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/dr_verify.py +0 -0
  162. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/drive.py +0 -0
  163. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/drive_queue.py +0 -0
  164. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/drive_sessions_snapshot.py +0 -0
  165. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/drive_state.py +0 -0
  166. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/events.py +0 -0
  167. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/failure_class.py +0 -0
  168. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/failure_classifier.py +0 -0
  169. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/filelock.py +0 -0
  170. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/fleet_config_health.py +0 -0
  171. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/forge_availability.py +0 -0
  172. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/freshness.py +0 -0
  173. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/gate_a.py +0 -0
  174. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/gate_b.py +0 -0
  175. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/gate_snapshot.py +0 -0
  176. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/gates.py +0 -0
  177. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/gen_board_fixture.py +0 -0
  178. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/github_throttle.py +0 -0
  179. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/goal.py +0 -0
  180. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/graph_health.py +0 -0
  181. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/gtk_native_driver.py +0 -0
  182. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/__init__.py +0 -0
  183. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/aggregate.py +0 -0
  184. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/__init__.py +0 -0
  185. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/_ci_pin.py +0 -0
  186. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/agent_install.py +0 -0
  187. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/cargo_targets.py +0 -0
  188. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/claude_binary.py +0 -0
  189. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/config_drift.py +0 -0
  190. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  191. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/coord_web_ci_pin.py +0 -0
  192. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/deploy_lane_facts.py +0 -0
  193. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/disk.py +0 -0
  194. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/fleet_board.py +0 -0
  195. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  196. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/fleet_phantom.py +0 -0
  197. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/fleet_unit_drift.py +0 -0
  198. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/graph.py +0 -0
  199. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/graphify_cli.py +0 -0
  200. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/index_lock.py +0 -0
  201. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/issues_sync_staleness.py +0 -0
  202. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/local_machine_identity.py +0 -0
  203. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/plan_usage.py +0 -0
  204. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/pr_churn.py +0 -0
  205. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/release_cordon.py +0 -0
  206. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/repo_state.py +0 -0
  207. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/spawned_coord.py +0 -0
  208. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/stalled_pipeline.py +0 -0
  209. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/timer_active.py +0 -0
  210. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/toolchain.py +0 -0
  211. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/unit_drift.py +0 -0
  212. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/unit_enablement.py +0 -0
  213. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/wedged_drive_queue.py +0 -0
  214. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/checks/worktrees.py +0 -0
  215. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/cli.py +0 -0
  216. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/context.py +0 -0
  217. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/fleet_snapshot.py +0 -0
  218. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/models.py +0 -0
  219. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/pypi.py +0 -0
  220. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/registry.py +0 -0
  221. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/render.py +0 -0
  222. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/health/units.py +0 -0
  223. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/hooks.py +0 -0
  224. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/housekeeping.py +0 -0
  225. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/interactive.py +0 -0
  226. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/invariant_alarms.py +0 -0
  227. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/issue_store.py +0 -0
  228. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/issues_sync_status.py +0 -0
  229. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/liveness_auditor.py +0 -0
  230. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/mac_native_driver.py +0 -0
  231. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/machine_fault.py +0 -0
  232. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/machine_metrics.py +0 -0
  233. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/machine_onboard.py +0 -0
  234. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/machine_pause.py +0 -0
  235. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/machine_stats.py +0 -0
  236. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/milestone_chat.py +0 -0
  237. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/milestone_dispatch.py +0 -0
  238. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/milestone_gate.py +0 -0
  239. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/milestone_order.py +0 -0
  240. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/mock_author.py +0 -0
  241. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/models.py +0 -0
  242. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/network.py +0 -0
  243. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/new_issue_chat.py +0 -0
  244. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notifier/__init__.py +0 -0
  245. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notifier/baseline.py +0 -0
  246. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notifier/cli.py +0 -0
  247. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notifier/collect.py +0 -0
  248. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notifier/digest.py +0 -0
  249. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notifier/models.py +0 -0
  250. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notifier/predicate.py +0 -0
  251. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notifier/service.py +0 -0
  252. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notifier/store.py +0 -0
  253. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notifier/transport.py +0 -0
  254. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/notify.py +0 -0
  255. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/openapi.py +0 -0
  256. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/overlap_fence.py +0 -0
  257. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/overlap_predict.py +0 -0
  258. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/parentage.py +0 -0
  259. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/parentage_github.py +0 -0
  260. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/pipeline.py +0 -0
  261. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/plan_parser.py +0 -0
  262. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/plans.py +0 -0
  263. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/platform_paths.py +0 -0
  264. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/portal_bridge.py +0 -0
  265. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/portal_store.py +0 -0
  266. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/portal_sync.py +0 -0
  267. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/pr_body_lint.py +0 -0
  268. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/prereqs.py +0 -0
  269. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/progress.py +0 -0
  270. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/providers/__init__.py +0 -0
  271. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/providers/base.py +0 -0
  272. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/providers/claude.py +0 -0
  273. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/providers/claude_pty.py +0 -0
  274. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/providers/opencode.py +0 -0
  275. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/queue_diagnose.py +0 -0
  276. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/reconcile.py +0 -0
  277. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/reconcile_tick.py +0 -0
  278. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/refine_chat.py +0 -0
  279. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/release_cordon.py +0 -0
  280. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/release_gate.py +0 -0
  281. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/release_propagate.py +0 -0
  282. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/release_verify.py +0 -0
  283. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/release_window.py +0 -0
  284. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/repo_dormancy.py +0 -0
  285. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/repo_edit.py +0 -0
  286. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/repo_onboard.py +0 -0
  287. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/reports.py +0 -0
  288. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/restart_cmd.py +0 -0
  289. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/revalidate.py +0 -0
  290. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/scorecard.py +0 -0
  291. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/self_health.py +0 -0
  292. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  293. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  294. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  295. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  296. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  297. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/skills/portal-followup/SKILL.md +0 -0
  298. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/skills/release-now/SKILL.md +0 -0
  299. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  300. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  301. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/skills/update-issue/SKILL.md +0 -0
  302. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/smoke.py +0 -0
  303. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/smoke_tags.py +0 -0
  304. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/spend_ceiling.py +0 -0
  305. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/split_work.py +0 -0
  306. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/sql.py +0 -0
  307. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/stage_projection.py +0 -0
  308. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/store_migrate.py +0 -0
  309. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/store_parity.py +0 -0
  310. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/templates/deploy-cloudflare.node.yml +0 -0
  311. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/test_author.py +0 -0
  312. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/test_chat.py +0 -0
  313. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/test_orchestrator.py +0 -0
  314. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/test_report.py +0 -0
  315. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/tui_pty_driver.py +0 -0
  316. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/tui_release.py +0 -0
  317. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/uat_checks.py +0 -0
  318. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/usage.py +0 -0
  319. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/usage_limits.py +0 -0
  320. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/usage_rollup.py +0 -0
  321. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/win_native_bridge.py +0 -0
  322. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/win_native_driver.py +0 -0
  323. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coord/worker_events.py +0 -0
  324. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/coordinator.example.yml +0 -0
  325. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-agent.service +0 -0
  326. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-backup.service +0 -0
  327. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-backup.timer +0 -0
  328. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-db-backup.service +0 -0
  329. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-db-backup.sh +0 -0
  330. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-db-backup.timer +0 -0
  331. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-dr-verify.service +0 -0
  332. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-dr-verify.timer +0 -0
  333. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-drive-queue.service +0 -0
  334. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-drive-queue.timer +0 -0
  335. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-failure-notify.service +0 -0
  336. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-failure-notify.sh +0 -0
  337. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-fleet-watchdog.service +0 -0
  338. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-fleet-watchdog.timer +0 -0
  339. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-notify.service +0 -0
  340. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-notify.timer +0 -0
  341. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-release-propagate.service +0 -0
  342. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-release-propagate.timer +0 -0
  343. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-release-window.service +0 -0
  344. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-release-window.timer +0 -0
  345. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-serve.service +0 -0
  346. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-web-dist-build.service +0 -0
  347. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-web-dist-build.sh +0 -0
  348. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-web-dist-build.timer +0 -0
  349. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-web-rollback.sh +0 -0
  350. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/coord-web.service +0 -0
  351. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/deploy/node-shim.sh +0 -0
  352. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/ADR_COORD_TUI_CI.md +0 -0
  353. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  354. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/ADR_COORD_WEB_CI.md +0 -0
  355. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/ADR_COORD_WEB_DIST.md +0 -0
  356. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  357. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/AGENT_OPERATIONS.md +0 -0
  358. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/ARCHITECTURE.md +0 -0
  359. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/ARCH_SECURITY_GATES.md +0 -0
  360. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/COCKPIT.md +0 -0
  361. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/CONTROL_CENTER.md +0 -0
  362. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/COST_DISCIPLINE.md +0 -0
  363. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/CROSS_PLATFORM.md +0 -0
  364. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/CUSTOMER_FACING_APPS.md +0 -0
  365. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/CUSTOMER_PORTAL.md +0 -0
  366. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/DATA_STORE_SELECTION.md +0 -0
  367. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/DISASTER_RECOVERY.md +0 -0
  368. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/DRIVE_QUEUE.md +0 -0
  369. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/EPHEMERAL_WORKERS.md +0 -0
  370. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/FORGE_MIGRATION.md +0 -0
  371. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/GRAPHIFY_SETUP.md +0 -0
  372. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/ISSUE_GUIDANCE.md +0 -0
  373. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/MAC_MINI.md +0 -0
  374. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  375. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/NOTIFIER.md +0 -0
  376. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/OPENCODE_VERIFICATION.md +0 -0
  377. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/OPERATING_GOTCHAS.md +0 -0
  378. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/OPERATOR_GUIDES.md +0 -0
  379. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/ORACLE_LOOP.md +0 -0
  380. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/PHONE_WEBAPP.md +0 -0
  381. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/PIPELINE_V2.md +0 -0
  382. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/PLATFORM_EVOLUTION.md +0 -0
  383. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/SECOND_BACKEND.md +0 -0
  384. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/STORE_SERVICE.md +0 -0
  385. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  386. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/WEB_CONTROL_CENTER.md +0 -0
  387. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/WSL_WINDOWS_WORKER.md +0 -0
  388. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/mocks/web/README.md +0 -0
  389. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/mocks/web/_tokens.css +0 -0
  390. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/mocks/web/issue-detail.html +0 -0
  391. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/mocks/web/pipeline-narrow.html +0 -0
  392. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/docs/mocks/web/pipeline-wide.html +0 -0
  393. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/graphify-out/.gitignore +0 -0
  394. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/install-agent.sh +0 -0
  395. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/pyproject.toml +0 -0
  396. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/audit_review_verdict_overrides.py +0 -0
  397. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  398. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/build-worker-image.sh +0 -0
  399. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/coordinator-machine.py +0 -0
  400. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/dr-down.sh +0 -0
  401. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/dr-up.sh +0 -0
  402. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/epic-down.sh +0 -0
  403. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/epic-up.sh +0 -0
  404. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/preflight.sh +0 -0
  405. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/provision-server.sh +0 -0
  406. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/provision-worker.sh +0 -0
  407. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  408. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  409. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/throwaway-vm.sh +0 -0
  410. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/azure-workers/verify-github-token.sh +0 -0
  411. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/check_gh_argv_containment.py +0 -0
  412. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/codegen.py +0 -0
  413. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/coord-test-runner.sh +0 -0
  414. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  415. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  416. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  417. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  418. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/coord-venv-rollback.sh +0 -0
  419. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/drive-batch.sh +0 -0
  420. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/extract-coord-tui.sh +0 -0
  421. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/fleet_watchdog.py +0 -0
  422. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/gen_board_fixture.py +0 -0
  423. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/gen_mock_index.py +0 -0
  424. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/lib/provision-core.sh +0 -0
  425. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/next_release_tag.py +0 -0
  426. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/provision-machine.sh +0 -0
  427. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/run_tests_in_populated_home.sh +0 -0
  428. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/run_tests_without_gh.sh +0 -0
  429. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/setup-macmini.sh +0 -0
  430. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/smoke_437_interactive.py +0 -0
  431. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/verify-provision-noble.sh +0 -0
  432. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/verify_878_review_capture.py +0 -0
  433. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/verify_release_published.py +0 -0
  434. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/scripts/verify_release_wheel.py +0 -0
  435. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/setup.cfg +0 -0
  436. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/SMOKE_SET.md +0 -0
  437. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/__init__.py +0 -0
  438. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-37/conftest.py +0 -0
  439. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-37/contract.md +0 -0
  440. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-37/manifest.yml +0 -0
  441. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  442. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  443. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-51/contract.md +0 -0
  444. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  445. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  446. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-51/manifest.yml +0 -0
  447. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  448. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-51/tsconfig.json +0 -0
  449. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  450. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/backends.py +0 -0
  451. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/conftest.py +0 -0
  452. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/board-pipeline-basic.json +0 -0
  453. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  454. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  455. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  456. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  457. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/playwright/all_pass.json +0 -0
  458. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  459. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/playwright/mixed_fail.json +0 -0
  460. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  461. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  462. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/playwright/skip.json +0 -0
  463. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/playwright/truncated.json +0 -0
  464. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  465. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  466. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  467. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  468. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  469. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  470. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  471. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  472. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  473. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_acceptance.py +0 -0
  474. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_acceptance_drivers.py +0 -0
  475. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent.py +0 -0
  476. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_api_error.py +0 -0
  477. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_app.py +0 -0
  478. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_branch_base.py +0 -0
  479. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_branch_capture.py +0 -0
  480. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_config_free_1712.py +0 -0
  481. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_deploy_units_endpoint.py +0 -0
  482. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_dirty_worktree.py +0 -0
  483. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  484. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_graph_self_heal.py +0 -0
  485. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_health_h3.py +0 -0
  486. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_idle_restart.py +0 -0
  487. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_push_failure.py +0 -0
  488. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_reap.py +0 -0
  489. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_repos_and_pull.py +0 -0
  490. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_restart_services_endpoint.py +0 -0
  491. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_skills_self_heal.py +0 -0
  492. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_startup_diagnostics.py +0 -0
  493. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_update.py +0 -0
  494. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_update_bluegreen.py +0 -0
  495. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_usage_limit.py +0 -0
  496. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_agent_zero_commit.py +0 -0
  497. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_ambient_home_isolation.py +0 -0
  498. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_approve_capability_reroute_3241.py +0 -0
  499. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_approve_dependency_busy_2804.py +0 -0
  500. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_approve_reject_plan.py +0 -0
  501. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_approve_usage_gate.py +0 -0
  502. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_approved_work_2532.py +0 -0
  503. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_approved_work_2996.py +0 -0
  504. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_assignment_already_recorded_daemon.py +0 -0
  505. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_audit_log.py +0 -0
  506. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_audit_outcome.py +0 -0
  507. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_audit_query.py +0 -0
  508. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_auto_loop.py +0 -0
  509. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_auto_release_publish_2035.py +0 -0
  510. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_backend_selection.py +0 -0
  511. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_backup.py +0 -0
  512. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_base_checkout_restore.py +0 -0
  513. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_block_log.py +0 -0
  514. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_board_cap_762.py +0 -0
  515. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_board_fixture.py +0 -0
  516. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_board_read_path.py +0 -0
  517. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_board_schema.py +0 -0
  518. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_board_service.py +0 -0
  519. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_board_state.py +0 -0
  520. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_board_wire.py +0 -0
  521. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_brain.py +0 -0
  522. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_branch_model.py +0 -0
  523. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_bug_intake.py +0 -0
  524. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_bugbash.py +0 -0
  525. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_build_worker_image_env_update.py +0 -0
  526. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cargo_cache.py +0 -0
  527. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_check_gh_argv_containment.py +0 -0
  528. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_ci_acceptance_gate_1950.py +0 -0
  529. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_ci_fix.py +0 -0
  530. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_ci_github.py +0 -0
  531. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_ci_gitlab.py +0 -0
  532. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_ci_parity_2091.py +0 -0
  533. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_ci_store.py +0 -0
  534. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_claim.py +0 -0
  535. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_claude_md_budget.py +0 -0
  536. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_claude_setup_token.py +0 -0
  537. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_acceptance.py +0 -0
  538. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_assign.py +0 -0
  539. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  540. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_assign_interactive_remote.py +0 -0
  541. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_assign_provider.py +0 -0
  542. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  543. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_audit.py +0 -0
  544. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_chat_continue.py +0 -0
  545. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_ci.py +0 -0
  546. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_codegen.py +0 -0
  547. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_decide.py +0 -0
  548. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_diagnose_capability_rules.py +0 -0
  549. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_diagnose_config_provenance.py +0 -0
  550. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_diagnose_forge_availability.py +0 -0
  551. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_diagnose_graph.py +0 -0
  552. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_diagnose_self.py +0 -0
  553. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_diagnose_test_coverage.py +0 -0
  554. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_doctor.py +0 -0
  555. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_doctor_config_free_1801.py +0 -0
  556. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  557. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  558. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_drive.py +0 -0
  559. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_drive_queue.py +0 -0
  560. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_escalate.py +0 -0
  561. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_fix_headless_review.py +0 -0
  562. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_gate_a.py +0 -0
  563. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_install_drift.py +0 -0
  564. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_install_skills.py +0 -0
  565. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_issue_comment.py +0 -0
  566. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_issue_create_label.py +0 -0
  567. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_issue_reopen.py +0 -0
  568. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_issue_view_list.py +0 -0
  569. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_issues.py +0 -0
  570. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_merge.py +0 -0
  571. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_milestone_assign.py +0 -0
  572. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_milestone_capture.py +0 -0
  573. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_milestone_chat_add_child.py +0 -0
  574. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_milestone_dispatch.py +0 -0
  575. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_milestone_gate_b.py +0 -0
  576. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_milestone_gate_c.py +0 -0
  577. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_milestone_order.py +0 -0
  578. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  579. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_milestone_ship.py +0 -0
  580. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_network.py +0 -0
  581. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_new_issue_chat.py +0 -0
  582. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_plans.py +0 -0
  583. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_portal.py +0 -0
  584. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_pr.py +0 -0
  585. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_pull_artifact.py +0 -0
  586. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_queue.py +0 -0
  587. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_reattach_sessions.py +0 -0
  588. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_refine_board.py +0 -0
  589. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_release_preflight.py +0 -0
  590. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_release_propagate.py +0 -0
  591. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_release_window.py +0 -0
  592. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_repo_2220.py +0 -0
  593. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  594. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_scorecard.py +0 -0
  595. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_serve_store_backend_3084.py +0 -0
  596. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_set_review_findings.py +0 -0
  597. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_advisory_terminal.py +0 -0
  598. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_contested_tag.py +0 -0
  599. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_invariant_alarms.py +0 -0
  600. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_machine_fault.py +0 -0
  601. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_merge_queue.py +0 -0
  602. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_provider.py +0 -0
  603. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_retried_3340.py +0 -0
  604. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_review_finalizing.py +0 -0
  605. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_supervisor_3366.py +0 -0
  606. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_test_failed_tag.py +0 -0
  607. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_status_usage_limit.py +0 -0
  608. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_sync_comments_873.py +0 -0
  609. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_test_plan.py +0 -0
  610. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_track.py +0 -0
  611. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_tui_update.py +0 -0
  612. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cli_wait.py +0 -0
  613. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_client.py +0 -0
  614. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_client_base_install.py +0 -0
  615. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_client_config_cache_atomic_3052.py +0 -0
  616. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_client_resource_migration_1946.py +0 -0
  617. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_commands_common.py +0 -0
  618. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_completion_summary.py +0 -0
  619. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_config.py +0 -0
  620. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_config_acceptance.py +0 -0
  621. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_config_audit.py +0 -0
  622. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_config_drift_check.py +0 -0
  623. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_config_effective.py +0 -0
  624. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_config_pricing.py +0 -0
  625. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  626. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_config_usage_gate.py +0 -0
  627. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_confirm_test.py +0 -0
  628. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_conflict_fix.py +0 -0
  629. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_conflict_fix_semantic.py +0 -0
  630. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  631. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_coord_test.py +0 -0
  632. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  633. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_coord_test_runner_baseline.py +0 -0
  634. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_coord_test_runner_populated_home.py +0 -0
  635. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_coord_test_runner_routing.py +0 -0
  636. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_coord_test_runner_toolchain.py +0 -0
  637. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_coord_uat.py +0 -0
  638. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_coord_web_sse_restart_live.py +0 -0
  639. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_coordinator_machine.py +0 -0
  640. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_cross_platform_imports.py +0 -0
  641. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dao.py +0 -0
  642. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dashboard.py +0 -0
  643. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dashboard_api.py +0 -0
  644. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dashboard_fixture.py +0 -0
  645. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dashboard_reports.py +0 -0
  646. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dashboard_server.py +0 -0
  647. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dashboard_terminal.py +0 -0
  648. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dashboard_terminal_live.py +0 -0
  649. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_db.py +0 -0
  650. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dead_end.py +0 -0
  651. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_decomposition_chat.py +0 -0
  652. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deploy_coord_db_backup.py +0 -0
  653. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deploy_coord_web_dist.py +0 -0
  654. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deploy_coord_web_rollback.py +0 -0
  655. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deploy_db_backup_unit.py +0 -0
  656. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deploy_drive_queue_unit.py +0 -0
  657. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deploy_failure_notify_unit.py +0 -0
  658. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deploy_manifest.py +0 -0
  659. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deploy_notify_unit.py +0 -0
  660. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deploy_units_lane.py +0 -0
  661. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deploy_web_unit.py +0 -0
  662. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deprecation_telemetry.py +0 -0
  663. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_deps.py +0 -0
  664. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_diagnose.py +0 -0
  665. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dirlink.py +0 -0
  666. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dispatch.py +0 -0
  667. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dispatch_liveness.py +0 -0
  668. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dispatch_target_validation.py +0 -0
  669. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dispatch_workers.py +0 -0
  670. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dist_name.py +0 -0
  671. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_done_housekeeping.py +0 -0
  672. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dr_azure_scripts.py +0 -0
  673. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dr_promote.py +0 -0
  674. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_dr_verify.py +0 -0
  675. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive.py +0 -0
  676. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_machine_fault.py +0 -0
  677. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_queue.py +0 -0
  678. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_queue_blocked_rendering.py +0 -0
  679. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_queue_launch_argv.py +0 -0
  680. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_queue_max_parallel_config.py +0 -0
  681. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  682. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_queue_roll_pending.py +0 -0
  683. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  684. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_sessions_snapshot.py +0 -0
  685. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_state.py +0 -0
  686. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_drive_tmux.py +0 -0
  687. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_epic_up_capability_detection.py +0 -0
  688. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  689. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_epic_up_image_provenance.py +0 -0
  690. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_errors.py +0 -0
  691. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_events.py +0 -0
  692. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_failure_class.py +0 -0
  693. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_failure_classifier.py +0 -0
  694. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_filelock.py +0 -0
  695. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  696. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_fix_escalation_classifier.py +0 -0
  697. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_fix_of_force_override.py +0 -0
  698. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_fleet_config_health.py +0 -0
  699. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_fleet_health_probes.py +0 -0
  700. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_fleet_health_snapshot.py +0 -0
  701. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_fleet_watchdog.py +0 -0
  702. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_forge_availability.py +0 -0
  703. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_freshness.py +0 -0
  704. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_gate_a.py +0 -0
  705. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_gate_b.py +0 -0
  706. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_gate_snapshot_staleness.py +0 -0
  707. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_gates.py +0 -0
  708. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  709. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_gen_mock_index.py +0 -0
  710. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_generated_rust_fixture.py +0 -0
  711. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_generated_rust_requests.py +0 -0
  712. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_generated_types_fixture.py +0 -0
  713. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_github_throttle.py +0 -0
  714. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_goal.py +0 -0
  715. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_graph_health.py +0 -0
  716. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_graph_selfheal_absent_2237.py +0 -0
  717. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_gtk_native_driver.py +0 -0
  718. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_handoff.py +0 -0
  719. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_checks.py +0 -0
  720. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_cli.py +0 -0
  721. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_cli_graph.py +0 -0
  722. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_config.py +0 -0
  723. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_context.py +0 -0
  724. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_coord_tui_ci_pin.py +0 -0
  725. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_coord_web_ci_pin.py +0 -0
  726. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_deploy_lane_facts.py +0 -0
  727. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_fix.py +0 -0
  728. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_incident_regression.py +0 -0
  729. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_issues_sync_staleness.py +0 -0
  730. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_pr_churn.py +0 -0
  731. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_pypi.py +0 -0
  732. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_registry.py +0 -0
  733. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_release_cordon_probe.py +0 -0
  734. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_timer_active.py +0 -0
  735. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_toolchain.py +0 -0
  736. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_unit_drift.py +0 -0
  737. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_unit_enablement.py +0 -0
  738. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_health_wedged_drive_queue.py +0 -0
  739. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_hooks.py +0 -0
  740. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_housekeeping.py +0 -0
  741. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_human_attended_437.py +0 -0
  742. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_init.py +0 -0
  743. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_install_agent_capabilities_3515.py +0 -0
  744. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_install_agent_venv_2911.py +0 -0
  745. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  746. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_integration.py +0 -0
  747. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_interactive.py +0 -0
  748. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_interactive_briefing_echo.py +0 -0
  749. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_interactive_pane_log_2541.py +0 -0
  750. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_interactive_prefill_state.py +0 -0
  751. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_interactive_session_relaunch.py +0 -0
  752. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_interactive_test_verdict_backstop.py +0 -0
  753. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_interactive_token_attribution.py +0 -0
  754. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_interactive_worktree.py +0 -0
  755. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_invariant_alarms.py +0 -0
  756. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_issue_store_seam.py +0 -0
  757. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_issues_sync_status.py +0 -0
  758. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_liveness_auditor.py +0 -0
  759. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_liveness_notify.py +0 -0
  760. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_lock_contention_ratchet.py +0 -0
  761. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_mac_native_driver.py +0 -0
  762. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_machine_fault.py +0 -0
  763. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_machine_metrics.py +0 -0
  764. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_machine_onboard.py +0 -0
  765. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_machine_pause.py +0 -0
  766. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_machine_stats.py +0 -0
  767. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_merge_verify.py +0 -0
  768. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_milestone_chat.py +0 -0
  769. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_milestone_dispatch.py +0 -0
  770. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_milestone_gate.py +0 -0
  771. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_milestone_order.py +0 -0
  772. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_milestone_seam.py +0 -0
  773. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_mock_author.py +0 -0
  774. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_model_tiering.py +0 -0
  775. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_models.py +0 -0
  776. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_models_config_labels.py +0 -0
  777. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_needs_attention.py +0 -0
  778. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_network.py +0 -0
  779. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_new_issue_chat.py +0 -0
  780. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_next_release_tag.py +0 -0
  781. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_node_shim.py +0 -0
  782. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notifier_baseline.py +0 -0
  783. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notifier_cli.py +0 -0
  784. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notifier_collect.py +0 -0
  785. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notifier_config.py +0 -0
  786. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notifier_drive_seam.py +0 -0
  787. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notifier_isolation.py +0 -0
  788. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notifier_predicate.py +0 -0
  789. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notifier_quiet_hours.py +0 -0
  790. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notifier_service.py +0 -0
  791. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notify.py +0 -0
  792. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_notify_drain.py +0 -0
  793. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_openapi.py +0 -0
  794. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_operational_defaults.py +0 -0
  795. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_overlap_fence.py +0 -0
  796. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_overlap_predict.py +0 -0
  797. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_packaged_deploy_units.py +0 -0
  798. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_parentage.py +0 -0
  799. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_paste_landed.py +0 -0
  800. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  801. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_pipeline.py +0 -0
  802. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_plan_followup_approve_plan_command.py +0 -0
  803. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_plan_followup_pr_command.py +0 -0
  804. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_plan_followup_review_command.py +0 -0
  805. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_plan_only.py +0 -0
  806. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_plan_parser.py +0 -0
  807. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_platform_paths.py +0 -0
  808. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_portal_bridge.py +0 -0
  809. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_portal_config.py +0 -0
  810. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_portal_store.py +0 -0
  811. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_portal_sync.py +0 -0
  812. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_pr_body_lint.py +0 -0
  813. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_prereqs.py +0 -0
  814. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_production_db_guard.py +0 -0
  815. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_progress.py +0 -0
  816. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_provider_seam.py +0 -0
  817. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_providers.py +0 -0
  818. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_providers_config_labels.py +0 -0
  819. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_providers_pty.py +0 -0
  820. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_provision_core.py +0 -0
  821. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_provision_machine.py +0 -0
  822. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_py_rust_mirror_inventory.py +0 -0
  823. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_quiet_hours.py +0 -0
  824. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_quiet_hours_store_2146.py +0 -0
  825. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reap_merged_sessions.py +0 -0
  826. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reap_stale_interactive_tick.py +0 -0
  827. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reconcile.py +0 -0
  828. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reconcile_branch.py +0 -0
  829. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reconcile_completions.py +0 -0
  830. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  831. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reconcile_merges.py +0 -0
  832. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reconcile_no_agent_record.py +0 -0
  833. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reconcile_tick.py +0 -0
  834. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reconcile_usage_limit_done.py +0 -0
  835. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_refine_chat.py +0 -0
  836. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_cordon_2101.py +0 -0
  837. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  838. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_cordon_deadlock_2240.py +0 -0
  839. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  840. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_cordon_stuck_2490.py +0 -0
  841. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_gate.py +0 -0
  842. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_propagate.py +0 -0
  843. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_propagate_threshold.py +0 -0
  844. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_roll_between_legs_2854.py +0 -0
  845. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_roll_window_handoff.py +0 -0
  846. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_unified_1242.py +0 -0
  847. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_verify.py +0 -0
  848. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_release_window.py +0 -0
  849. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_remote_auto_prune.py +0 -0
  850. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_remote_interactive_reaper.py +0 -0
  851. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_repo_add.py +0 -0
  852. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_repo_dormancy.py +0 -0
  853. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_repo_edit_2220.py +0 -0
  854. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_repo_graph_fleet_2237.py +0 -0
  855. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_repo_max_parallel_3423.py +0 -0
  856. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_repo_onboard_2220.py +0 -0
  857. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_report_public_export.py +0 -0
  858. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_report_result_push.py +0 -0
  859. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_reports.py +0 -0
  860. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_restart_cmd.py +0 -0
  861. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_retry.py +0 -0
  862. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_retry_advisory_1606.py +0 -0
  863. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_retry_escalation_classify_3360.py +0 -0
  864. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_retry_type_1636.py +0 -0
  865. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_revalidate.py +0 -0
  866. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_review_end_review_without_verdict.py +0 -0
  867. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_review_parse_failure_diagnostic.py +0 -0
  868. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_review_reaffirm.py +0 -0
  869. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_review_state.py +0 -0
  870. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_review_verdict_backstop.py +0 -0
  871. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_review_verdict_override_audit.py +0 -0
  872. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_review_verdict_relay.py +0 -0
  873. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_review_zero_commits.py +0 -0
  874. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_scoped_review_wiring.py +0 -0
  875. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_scorecard.py +0 -0
  876. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_self_health.py +0 -0
  877. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_serve_app.py +0 -0
  878. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_serve_app_board_trim.py +0 -0
  879. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_session.py +0 -0
  880. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_slice_issue_attribution.py +0 -0
  881. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_smoke.py +0 -0
  882. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  883. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_smoke_live_checkout_restore.py +0 -0
  884. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_smoke_workflow.py +0 -0
  885. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_spend_ceiling.py +0 -0
  886. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_spend_ceiling_coordinator.py +0 -0
  887. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_split.py +0 -0
  888. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_split_work.py +0 -0
  889. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_sql_dialect.py +0 -0
  890. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_sqlite_connect_ratchet.py +0 -0
  891. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_stage_projection.py +0 -0
  892. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_stale_busy_reviewer_697.py +0 -0
  893. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_stalled_pipeline.py +0 -0
  894. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_state_review_findings_daemon.py +0 -0
  895. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_status_fleet_footer.py +0 -0
  896. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_stop_1567.py +0 -0
  897. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_store_contract.py +0 -0
  898. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_store_migrate.py +0 -0
  899. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_stuck.py +0 -0
  900. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  901. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_terminal_command.py +0 -0
  902. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_test_author.py +0 -0
  903. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_test_chat.py +0 -0
  904. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_test_orchestrator.py +0 -0
  905. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_test_report.py +0 -0
  906. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_test_verdict_parsing.py +0 -0
  907. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_test_verdict_transcript_floor.py +0 -0
  908. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_text_io_encoding_audit.py +0 -0
  909. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_thin_client_board_audit.py +0 -0
  910. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_thin_client_config_load_1080.py +0 -0
  911. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_thin_client_daemon_routing_906.py +0 -0
  912. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_throwaway_vm.py +0 -0
  913. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_tmux_host.py +0 -0
  914. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_tmux_session.py +0 -0
  915. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_transcript_floor.py +0 -0
  916. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_tui_pty_driver.py +0 -0
  917. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_uat_checks.py +0 -0
  918. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_usage.py +0 -0
  919. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_usage_limits.py +0 -0
  920. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_usage_rollup.py +0 -0
  921. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_venv_live_install_2121.py +0 -0
  922. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_version_single_source.py +0 -0
  923. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_watch.py +0 -0
  924. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_win_native_bridge.py +0 -0
  925. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_win_native_driver.py +0 -0
  926. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  927. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_worker_env_venv_isolation.py +0 -0
  928. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_worker_events.py +0 -0
  929. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_worker_image_pin_sync.py +0 -0
  930. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_worker_safety.py +0 -0
  931. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_worker_test_scoping.py +0 -0
  932. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_worktree.py +0 -0
  933. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  934. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/test_write_parity.py +0 -0
  935. {code_coordinator-0.5.580 → code_coordinator-0.5.582}/tests/write_parity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.580
3
+ Version: 0.5.582
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.580
3
+ Version: 0.5.582
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
@@ -724,6 +724,7 @@ tests/test_machine_onboard.py
724
724
  tests/test_machine_pause.py
725
725
  tests/test_machine_stats.py
726
726
  tests/test_merge_queue.py
727
+ tests/test_merge_verification.py
727
728
  tests/test_merge_verify.py
728
729
  tests/test_milestone_chat.py
729
730
  tests/test_milestone_dispatch.py
@@ -751,6 +751,7 @@
751
751
  "tests/test_machine_pause.py",
752
752
  "tests/test_machine_stats.py",
753
753
  "tests/test_merge_queue.py",
754
+ "tests/test_merge_verification.py",
754
755
  "tests/test_merge_verify.py",
755
756
  "tests/test_milestone_chat.py",
756
757
  "tests/test_milestone_dispatch.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.580",
2
+ "tag": "0.5.582",
3
3
  "distance": 0,
4
- "node": "gd3b3a8b69209767b94d3b03aeea8d17b2a32d9f9",
4
+ "node": "g66c11e8b562c82e18514dbd82f17849abf5c1df2",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-03"
@@ -84,6 +84,20 @@ EVENT_PHANTOM_HEALED = "phantom_row_healed"
84
84
  # the two are complementary, not overlapping. Like EVENT_PHANTOM_HEALED,
85
85
  # this narrates an action ALREADY TAKEN, not only a finding.
86
86
  EVENT_STUCK_TEST_STATE_HEALED = "stuck_test_state_healed"
87
+ # #2109: the merge-time verification note — coordinator-assembled facts
88
+ # (merge SHA, tests touched, Test/Review verdicts + machines, a harness-
89
+ # limits caveat, a manual spot-check pointer) posted on the issue the
90
+ # instant a `type="work"`-like entry merges. Distinct from every event
91
+ # above: those all narrate a PIPELINE condition (stuck, stalled, healed);
92
+ # this one exists so the richest account of a fix — today reachable only
93
+ # via `git show` on the worker's own commit message (see #2109's own
94
+ # issue body) — lands somewhere a human actually looks. Never worker-
95
+ # authored prose: every field is derived from board state or the diff
96
+ # (`coord.merge_queue._build_verification_comment`). Kept to exactly one
97
+ # comment per issue — a second merge on the same issue (fix-1/retry
98
+ # landing a second branch) UPDATES this comment in place
99
+ # (`coord.state.upsert_issue_comment`) rather than appending a duplicate.
100
+ EVENT_VERIFICATION = "verification"
87
101
 
88
102
 
89
103
  @dataclass
@@ -965,3 +979,156 @@ def format_plan(
965
979
  lines.append(estimate.strip())
966
980
 
967
981
  return "\n".join(lines)
982
+
983
+
984
+ # ── Verification note (#2109) ────────────────────────────────────────────────
985
+
986
+ _REPRO_HEADING_RE = re.compile(
987
+ r"^#{1,6}\s*(?:Repro(?:duce|duction)?(?:\s+steps)?|Steps\s+to\s+reproduce)\b"
988
+ r".*?\n(?P<body>.*?)(?=\n#{1,6}\s|\Z)",
989
+ re.IGNORECASE | re.DOTALL | re.MULTILINE,
990
+ )
991
+
992
+
993
+ def extract_repro_section(issue_body: str | None) -> str | None:
994
+ """Pull the repro/reproduction section out of an issue body, or
995
+ ``None`` when absent/blank.
996
+
997
+ Recognises ``## Repro``, ``## Reproduction``, ``## Repro steps``,
998
+ ``## Reproduce``, and ``## Steps to reproduce`` headings (#2109 review
999
+ nit — real issue bodies vary more than the original fixtures assumed).
1000
+
1001
+ Used by the #2109 verification note's manual spot-check section — the
1002
+ one piece of the note that is quoted, not derived, and quoted from the
1003
+ issue's OWN pre-fix text (never worker prose) so a human has concrete
1004
+ steps to re-check against, not a restatement of the fix.
1005
+ """
1006
+ if not issue_body:
1007
+ return None
1008
+ m = _REPRO_HEADING_RE.search(issue_body)
1009
+ if not m:
1010
+ return None
1011
+ body = m.group("body").strip()
1012
+ return body or None
1013
+
1014
+
1015
+ _HARNESS_LIMIT_CAVEATS: dict[str, str] = {
1016
+ "gtk": (
1017
+ "This diff matched this repo's `gtk` capability rule. `GtkDriver` "
1018
+ "synthesises `UiEvent`s directly, so a passing GTK Test/Review leg "
1019
+ "does **not** exercise real GDK signal delivery, `EventController` "
1020
+ "wiring, IME/dead keys, or painted geometry at real DPI."
1021
+ ),
1022
+ "tui": (
1023
+ "This diff matched this repo's `tui` capability rule. `TestBackend` "
1024
+ "does not parse real ANSI/SGR sequences, so a passing TUI Test/"
1025
+ "Review leg does **not** confirm raw-mode input, real terminal "
1026
+ "rendering, or mouse-event delivery."
1027
+ ),
1028
+ "browser": (
1029
+ "This diff matched this repo's `browser` capability rule. A "
1030
+ "headless-browser Test leg exercises the DOM but not every real "
1031
+ "input path (native OS file pickers, drag-and-drop from outside "
1032
+ "the browser, platform IME) — treat it as a strong but incomplete "
1033
+ "proxy for a human driving the real UI."
1034
+ ),
1035
+ }
1036
+
1037
+ DEFAULT_HARNESS_LIMIT_CAVEAT = (
1038
+ "No repo-specific harness-limits caveat is on file for the capability "
1039
+ "(if any) this diff's `smoke_tests.capability_rules` matched — a green "
1040
+ "Test/Review gate does not by itself prove every layer the change "
1041
+ "touches was actually exercised."
1042
+ )
1043
+
1044
+
1045
+ def harness_limits_caveat(matched_capabilities: Iterable[str]) -> str:
1046
+ """The standing #2109 caveat for the first of *matched_capabilities*
1047
+ (in order) this module has a caveat on file for, or
1048
+ :data:`DEFAULT_HARNESS_LIMIT_CAVEAT` when none match.
1049
+
1050
+ *matched_capabilities* is expected to come straight out of
1051
+ ``coord.smoke.match_rules`` — the SAME `smoke_tests.capability_rules`
1052
+ matcher Test-stage routing already uses, never a second,
1053
+ independently-maintained file-pattern list (#2096, one question one
1054
+ answer).
1055
+ """
1056
+ for cap in matched_capabilities:
1057
+ caveat = _HARNESS_LIMIT_CAVEATS.get(cap)
1058
+ if caveat:
1059
+ return caveat
1060
+ return DEFAULT_HARNESS_LIMIT_CAVEAT
1061
+
1062
+
1063
+ def format_verification(
1064
+ *,
1065
+ assignment_id: str,
1066
+ repo_name: str,
1067
+ issue_number: int,
1068
+ branch: str,
1069
+ merge_sha: str | None = None,
1070
+ pr_number: int | None = None,
1071
+ test_files: Iterable[str] = (),
1072
+ test_verdict: str | None = None,
1073
+ test_machine: str | None = None,
1074
+ review_verdict: str | None = None,
1075
+ review_machine: str | None = None,
1076
+ harness_caveat: str = DEFAULT_HARNESS_LIMIT_CAVEAT,
1077
+ repro: str | None = None,
1078
+ ) -> str:
1079
+ """Build the #2109 coordinator-assembled verification note.
1080
+
1081
+ Every field here is a fact the coordinator already holds — a merge SHA,
1082
+ a diff-derived file list, a recorded gate verdict + the machine that
1083
+ produced it, a repo-config-derived caveat, a quote from the issue's own
1084
+ pre-fix ``## Repro`` section — never worker-authored prose. Posted (or
1085
+ updated in place, see ``coord.state.upsert_issue_comment``) by
1086
+ ``coord.merge_queue._maybe_post_verification`` the instant a merge
1087
+ lands.
1088
+ """
1089
+ marker = _marker(
1090
+ EVENT_VERIFICATION,
1091
+ assignment=assignment_id,
1092
+ repo=repo_name,
1093
+ issue=issue_number,
1094
+ )
1095
+ branch_line = f"**Branch:** `{branch}`"
1096
+ if pr_number is not None:
1097
+ branch_line += f" (PR #{pr_number})"
1098
+ test_files = list(test_files)
1099
+ lines = [
1100
+ "## 🔍 Coordinator: Verification note",
1101
+ marker,
1102
+ branch_line,
1103
+ f"**Merge commit:** `{merge_sha}`" if merge_sha else "**Merge commit:** (not recorded)",
1104
+ "",
1105
+ "### Tests added/changed",
1106
+ _fmt_files(test_files) if test_files else "(none detected in the diff)",
1107
+ "",
1108
+ "### Gate verdicts",
1109
+ (
1110
+ f"- **Test:** {test_verdict or '(no verdict recorded)'}"
1111
+ + (f" — ran on `{test_machine}`" if test_machine else "")
1112
+ ),
1113
+ (
1114
+ f"- **Review:** {review_verdict or '(no verdict recorded)'}"
1115
+ + (f" — ran on `{review_machine}`" if review_machine else "")
1116
+ ),
1117
+ "",
1118
+ "### Harness-limits caveat",
1119
+ harness_caveat,
1120
+ "",
1121
+ "### Manual spot-check",
1122
+ (
1123
+ repro.strip()
1124
+ if repro and repro.strip()
1125
+ else (
1126
+ f"No `## Repro` section found on issue #{issue_number} — "
1127
+ "check the issue body directly."
1128
+ )
1129
+ ),
1130
+ "",
1131
+ "_Assembled automatically by the coordinator from board state and "
1132
+ "the merged diff — not worker-authored._",
1133
+ ]
1134
+ return "\n".join(lines)
@@ -1592,6 +1592,28 @@ def post_issue_comment(repo: str, issue_number: int, body: str):
1592
1592
  _capture_comment_write(repo, issue_number, body, url)
1593
1593
 
1594
1594
 
1595
+ def update_issue_comment(repo: str, issue_number: int, comment_id: int, body: str) -> None:
1596
+ """Overwrite an existing issue comment's body in place (#2109) — the
1597
+ update half of :func:`post_issue_comment`, so a standing marked comment
1598
+ (e.g. the merge-time verification note, ``coord.state.
1599
+ upsert_issue_comment``) can be refreshed on a second merge of the same
1600
+ issue instead of appended as a duplicate.
1601
+
1602
+ *comment_id* is the numeric REST id (``parse_comment_id`` on a comment's
1603
+ ``url``), not the GraphQL node id ``get_issue_comments`` returns as
1604
+ ``id``. *issue_number* isn't read by the PATCH itself (GitHub addresses
1605
+ a comment purely by its own id) — it's accepted anyway so the #873
1606
+ capture-at-write mirror below is keyed exactly like
1607
+ :func:`post_issue_comment`'s.
1608
+ """
1609
+ _gh(
1610
+ "api", f"repos/{repo}/issues/comments/{comment_id}", "-X", "PATCH",
1611
+ "-f", f"body={body}", caller="github_ops.update_issue_comment",
1612
+ )
1613
+ fake_url = f"https://github.com/{repo}/issues/{issue_number}#issuecomment-{comment_id}"
1614
+ _capture_comment_write(repo, issue_number, body, fake_url)
1615
+
1616
+
1595
1617
  def _capture_comment_write(repo: str, issue_number: int, body: str, url: str) -> None:
1596
1618
  """Best-effort mirror of a just-posted comment into the durable
1597
1619
  ``issue_comments`` table (#873).
@@ -63,6 +63,7 @@ from coord.state import (
63
63
  comment_on_issue,
64
64
  dismiss_drive_escalation,
65
65
  record_uat_verdict,
66
+ upsert_issue_comment,
66
67
  )
67
68
  from coord.uat_checks import UatCheckResult, evaluate_uat_checks
68
69
 
@@ -7343,6 +7344,228 @@ def _maybe_push_status(
7343
7344
  return None
7344
7345
 
7345
7346
 
7347
+ # ── Verification note (#2109) ───────────────────────────────────────────────
7348
+ #
7349
+ # Today the richest, only POST-fix account of a merged change lives solely in
7350
+ # the worker's own commit message — reachable only via `git show`, not from
7351
+ # the issue, the PR, or the TUI (see #2109's own issue body for the vimcode
7352
+ # evidence). This posts a `<!-- coord:event=verification -->` comment on the
7353
+ # issue the instant a merge lands, assembled entirely from facts the
7354
+ # coordinator already holds (board state, the diff) — never worker-authored
7355
+ # prose, which would just reintroduce self-reporting.
7356
+
7357
+
7358
+ def _latest_review_assignment_for_entry(
7359
+ entry: "QueuedMerge", board,
7360
+ ) -> Assignment | None:
7361
+ """The most-recently-dispatched verdict-bearing review :class:`Assignment`
7362
+ covering *entry*'s work chain — the same walk :func:`_latest_review_verdict`
7363
+ does, returning the Assignment itself (not just its verdict string) so a
7364
+ caller can also read its ``machine_name``.
7365
+ """
7366
+ if board is None:
7367
+ return None
7368
+ pool = list(getattr(board, "completed", []) or []) + list(getattr(board, "active", []) or [])
7369
+ branch_work_ids = _chain_work_ids(entry, pool)
7370
+ if not branch_work_ids:
7371
+ return None
7372
+ reviews = [
7373
+ a for a in pool
7374
+ if getattr(a, "type", None) == "review"
7375
+ and getattr(a, "review_of_assignment_id", None) in branch_work_ids
7376
+ and getattr(a, "review_verdict", None) is not None
7377
+ ]
7378
+ if not reviews:
7379
+ return None
7380
+ return max(reviews, key=lambda a: getattr(a, "dispatched_at", None) or 0.0)
7381
+
7382
+
7383
+ def _latest_smoke_assignment_for_entry(
7384
+ entry: "QueuedMerge", board,
7385
+ ) -> Assignment | None:
7386
+ """The most-recently-dispatched Test-stage (``type="smoke"``) child
7387
+ :class:`Assignment` for the work assignment behind *entry*.
7388
+
7389
+ ``Assignment.test_state`` (the verdict) lives on the WORK row; the
7390
+ machine that actually produced it lives on this child row — mirrors
7391
+ :func:`_latest_review_assignment_for_entry`'s split for the same reason.
7392
+ """
7393
+ if board is None:
7394
+ return None
7395
+ work = _work_assignment_for_entry(entry, board)
7396
+ if work is None:
7397
+ return None
7398
+ pool = list(getattr(board, "completed", []) or []) + list(getattr(board, "active", []) or [])
7399
+ smokes = [
7400
+ a for a in pool
7401
+ if getattr(a, "type", None) == "smoke"
7402
+ and getattr(a, "review_of_assignment_id", None) == getattr(work, "assignment_id", None)
7403
+ ]
7404
+ if not smokes:
7405
+ return None
7406
+ return max(smokes, key=lambda a: getattr(a, "dispatched_at", None) or 0.0)
7407
+
7408
+
7409
+ def _changed_test_files(
7410
+ entry: "QueuedMerge", gh_ops: "GhOps", *, touched: list[str] | None = None,
7411
+ ) -> list[str]:
7412
+ """Test files touched by the branch that just merged, derived straight
7413
+ from the diff (``gh_ops.get_compare_files``) — never from worker prose.
7414
+
7415
+ Heuristic file-PATH match only (no AST / ``#[test]`` parse): any
7416
+ touched path under a ``test(s)/`` directory, or matching the common
7417
+ ``test_*`` / ``*_test.*`` / ``*.test.*`` / ``*_spec.*`` / ``*.spec.*``
7418
+ naming conventions. Best-effort — a lookup failure (or a stub ``GhOps``
7419
+ that doesn't support ``get_compare_files`` returning falsy) yields an
7420
+ empty list, never raises.
7421
+
7422
+ *touched*, when supplied, is an already-fetched ``get_compare_files``
7423
+ result for this exact ``(target_branch, branch)`` pair — passed in by
7424
+ ``_build_verification_comment`` so the two callers don't make the same
7425
+ ``gh api compare`` round trip twice per merge (#2109 review, #2096: one
7426
+ question, one answer). ``None`` (the default) fetches it here, unchanged
7427
+ from this function's original standalone behaviour.
7428
+ """
7429
+ if touched is None:
7430
+ try:
7431
+ touched = gh_ops.get_compare_files(
7432
+ entry.repo_github, entry.target_branch, entry.branch,
7433
+ )
7434
+ except Exception: # noqa: BLE001 — best-effort, see docstring
7435
+ touched = None
7436
+ if not touched:
7437
+ return []
7438
+ out = []
7439
+ for path in touched:
7440
+ lower = f"/{path.lower()}"
7441
+ base = lower.rsplit("/", 1)[-1]
7442
+ if (
7443
+ "/test/" in lower or "/tests/" in lower
7444
+ or base.startswith("test_") or "_test." in base
7445
+ or ".test." in base or "_spec." in base or ".spec." in base
7446
+ ):
7447
+ out.append(path)
7448
+ return out
7449
+
7450
+
7451
+ def _matched_smoke_capabilities(touched_files: list[str], config) -> list[str]:
7452
+ """Which ``smoke_tests.capability_rules`` capabilities *touched_files*
7453
+ matches — via :func:`coord.smoke.match_rules`, the SAME matcher
7454
+ Test-stage routing itself uses, so the #2109 harness-limits caveat below
7455
+ can never silently disagree with what actually got routed (#2096, one
7456
+ question one answer). Returns ``[]`` when *config* is ``None`` or
7457
+ declares no capability rules.
7458
+ """
7459
+ from coord.smoke import match_rules # noqa: PLC0415
7460
+
7461
+ smoke_cfg = getattr(config, "smoke_tests", None) if config is not None else None
7462
+ rules = getattr(smoke_cfg, "capability_rules", None) or []
7463
+ return match_rules(touched_files, rules)
7464
+
7465
+
7466
+ def _build_verification_comment(
7467
+ entry: "QueuedMerge", board, gh_ops: "GhOps", config,
7468
+ ) -> str:
7469
+ """Assemble the #2109 merge-time verification note for *entry* — every
7470
+ field a fact already on the board or in the diff, never worker prose.
7471
+ """
7472
+ from coord.comments import extract_repro_section, format_verification, harness_limits_caveat # noqa: PLC0415
7473
+
7474
+ try:
7475
+ touched = gh_ops.get_compare_files(
7476
+ entry.repo_github, entry.target_branch, entry.branch,
7477
+ ) or []
7478
+ except Exception: # noqa: BLE001 — best-effort
7479
+ touched = []
7480
+
7481
+ # #2109 review: `entry.target_branch_head_sha` is captured BEFORE the
7482
+ # merge (at the gating/staleness check, so `has_smoke_verdict` can tell
7483
+ # whether the target moved since the test verdict was recorded) — it is
7484
+ # by construction the PARENT commit, never the commit this merge just
7485
+ # produced. Reusing it here would silently mislabel the verification
7486
+ # note's headline "Merge commit" field with a stale pre-merge SHA (and,
7487
+ # in a batch sharing one target branch, the same stale SHA across every
7488
+ # entry in the group). This function is only ever called from
7489
+ # `_maybe_post_verification`, strictly after `gh_ops.merge_pr(...)` has
7490
+ # already succeeded, so a fresh fetch here is a genuinely different
7491
+ # question from the pre-merge one above — not a redundant repeat of it —
7492
+ # and is the only way to report the SHA the merge actually produced.
7493
+ try:
7494
+ merge_sha = gh_ops.get_branch_sha(entry.repo_github, entry.target_branch)
7495
+ except Exception: # noqa: BLE001 — best-effort
7496
+ merge_sha = None
7497
+
7498
+ test_files = _changed_test_files(entry, gh_ops, touched=touched)
7499
+
7500
+ work = _work_assignment_for_entry(entry, board)
7501
+ test_verdict = getattr(work, "test_state", None) if work is not None else None
7502
+ smoke = _latest_smoke_assignment_for_entry(entry, board)
7503
+ test_machine = getattr(smoke, "machine_name", None) if smoke is not None else None
7504
+
7505
+ review = _latest_review_assignment_for_entry(entry, board)
7506
+ review_verdict = getattr(review, "review_verdict", None) if review is not None else None
7507
+ review_machine = getattr(review, "machine_name", None) if review is not None else None
7508
+
7509
+ caveat = harness_limits_caveat(_matched_smoke_capabilities(touched, config))
7510
+
7511
+ get_issue = getattr(gh_ops, "get_issue", None)
7512
+ repro: str | None = None
7513
+ if get_issue is not None:
7514
+ try:
7515
+ issue_data = get_issue(entry.repo_github, entry.issue_number) or {}
7516
+ repro = extract_repro_section(issue_data.get("body"))
7517
+ except Exception: # noqa: BLE001 — best-effort
7518
+ repro = None
7519
+
7520
+ return format_verification(
7521
+ assignment_id=entry.assignment_id,
7522
+ repo_name=entry.repo_name,
7523
+ issue_number=entry.issue_number,
7524
+ branch=entry.branch,
7525
+ merge_sha=merge_sha,
7526
+ pr_number=entry.pr_number,
7527
+ test_files=test_files,
7528
+ test_verdict=test_verdict,
7529
+ test_machine=test_machine,
7530
+ review_verdict=review_verdict,
7531
+ review_machine=review_machine,
7532
+ harness_caveat=caveat,
7533
+ repro=repro,
7534
+ )
7535
+
7536
+
7537
+ def _maybe_post_verification(
7538
+ entry: "QueuedMerge", board, gh_ops: "GhOps", config,
7539
+ ) -> "MergeEvent | None":
7540
+ """Post (or update in place) the #2109 verification note on *entry*'s
7541
+ issue, right after a successful merge.
7542
+
7543
+ Scoped to ``CLOSES_ISSUE_TYPES`` entries — the same scope the close/
7544
+ comment decision just above already uses, since a ``mock-author``/
7545
+ ``test-author`` row has no single "did this fix the bug" question for a
7546
+ verification note to answer. Best-effort, same posture as every other
7547
+ post-merge hook in this block (:func:`_maybe_clear_expected_red`,
7548
+ :func:`_maybe_push_design_round`, :func:`_maybe_push_status`): a failure
7549
+ here is reported as an event and never undoes the merge that already
7550
+ happened.
7551
+ """
7552
+ if entry.assignment_type not in CLOSES_ISSUE_TYPES:
7553
+ return None
7554
+ try:
7555
+ body = _build_verification_comment(entry, board, gh_ops, config)
7556
+ except Exception as e: # noqa: BLE001 — best-effort, see docstring
7557
+ return MergeEvent(entry, "verification_note_failed", str(e))
7558
+ try:
7559
+ upsert_issue_comment(
7560
+ entry.repo_name, entry.issue_number, body, repo_github=entry.repo_github,
7561
+ )
7562
+ except Exception as e: # noqa: BLE001 — best-effort, see docstring
7563
+ return MergeEvent(entry, "verification_note_failed", str(e))
7564
+ return MergeEvent(
7565
+ entry, "verification_note_posted", f"posted/updated on issue #{entry.issue_number}",
7566
+ )
7567
+
7568
+
7346
7569
  def process(
7347
7570
  items: list[QueuedMerge],
7348
7571
  gh_ops: GhOps,
@@ -8960,6 +9183,15 @@ def process(
8960
9183
  status_event = MergeEvent(entry, "status_push_failed", str(e))
8961
9184
  if status_event is not None:
8962
9185
  events.append(status_event)
9186
+ # #2109: the verification note — same best-effort posture as
9187
+ # every hook above, posted last so it can read the freshest
9188
+ # board/diff state this merge produced.
9189
+ try:
9190
+ verification_event = _maybe_post_verification(entry, board, gh_ops, config)
9191
+ except Exception as e: # noqa: BLE001 — bookkeeping, never undoes a real merge
9192
+ verification_event = MergeEvent(entry, "verification_note_failed", str(e))
9193
+ if verification_event is not None:
9194
+ events.append(verification_event)
8963
9195
  continue
8964
9196
  entry.state = CONFLICT
8965
9197
  entry.error = msg
@@ -126,11 +126,14 @@ class IssueCommentCreate:
126
126
  durable ``issue_comments`` mirror (``/issue-comments`` ``capture``).
127
127
  * ``"sync"`` — backfill the mirror from the tracker
128
128
  (``/issue-comments`` ``sync``); ``body`` is not read.
129
+ * ``"upsert"`` (#2109) — post *body*, or edit an existing comment on the
130
+ same issue carrying the identical ``coord:event=...`` marker in place,
131
+ instead of appending a duplicate (``coord.state.upsert_issue_comment``).
129
132
  """
130
133
 
131
- #: The comment text. Required for ``post`` and ``capture``.
134
+ #: The comment text. Required for ``post``, ``capture``, and ``upsert``.
132
135
  body: str | None = None
133
- #: ``"post"`` | ``"capture"`` | ``"sync"``. Defaults to ``"post"``.
136
+ #: ``"post"`` | ``"capture"`` | ``"sync"`` | ``"upsert"``. Defaults to ``"post"``.
134
137
  action: str | None = None
135
138
  #: ``capture`` only: the tracker's own comment id, when known.
136
139
  gh_comment_id: int | None = None
@@ -3712,8 +3712,29 @@ def dispatch_review(
3712
3712
  # never match the merge-time `branch_patch_id`, which is computed from an
3713
3713
  # uncapped compare-API diff). The display copy shown to the reviewer is
3714
3714
  # then truncated locally from the same fetch — no second `gh` call.
3715
+ #
3716
+ # #2364: `pr` can legitimately be `None` here — the drive-queue path
3717
+ # opens PRs lazily, so "review ran before the PR existed" is a normal
3718
+ # timing, not an edge case. Previously that made `full_diff_text`
3719
+ # (and therefore `review_patch_id` below) permanently `None` for such
3720
+ # a review, which in turn made every later `review-reaffirm` against
3721
+ # it fail forever with "missing patch-id data" even though the stored
3722
+ # verdict was a real `approve`. Fall back to a direct branch-vs-base
3723
+ # compare diff — the exact same API `github_ops.get_branch_patch_id`
3724
+ # uses at merge time to fingerprint `branch_patch_id` — so the two
3725
+ # sides of the "did the content change" question are always computed
3726
+ # the same way, whether or not a PR happens to exist yet.
3715
3727
  _diff = diff_fetcher or github_ops.pr_diff
3716
- full_diff_text = _diff(repo.github, pr["number"], max_chars=None) if pr else None
3728
+ if pr:
3729
+ full_diff_text = _diff(repo.github, pr["number"], max_chars=None)
3730
+ else:
3731
+ _compare_diff_pre_pr = compare_diff_fetcher or github_ops.get_compare_diff
3732
+ try:
3733
+ full_diff_text = _compare_diff_pre_pr(
3734
+ repo.github, base_branch, completed.branch
3735
+ )
3736
+ except Exception: # noqa: BLE001 — fail-safe: missing diff is not blocking
3737
+ full_diff_text = None
3717
3738
 
3718
3739
  # #3196: cross-check `pr_diff`'s file list against a fresh, explicit
3719
3740
  # compare of the branch's own current refs before trusting it. A
@@ -3730,7 +3751,13 @@ def dispatch_review(
3730
3751
  # untrustworthy (not just that one file — a diff computed against
3731
3752
  # the wrong base is wrong throughout), so it's replaced outright by
3732
3753
  # the compare's own diff rather than patched.
3733
- if full_diff_text:
3754
+ #
3755
+ # #2364: skip entirely when `pr` is `None` — `full_diff_text` above
3756
+ # already came straight from `get_compare_diff`/*compare_diff_fetcher*,
3757
+ # the exact source this cross-check would otherwise fetch again to
3758
+ # corroborate it against. Re-running it would just spend two more
3759
+ # `gh` calls to confirm a diff agrees with itself.
3760
+ if full_diff_text and pr:
3734
3761
  _compare_files = compare_files_fetcher or github_ops.get_compare_files
3735
3762
  try:
3736
3763
  known_files = _compare_files(repo.github, base_branch, completed.branch)
@@ -2927,7 +2927,7 @@ RPC_SUPERSEDED_BY_RESOURCE: dict[str, str] = {
2927
2927
  "/issue-comment": 'POST /issue/{repo_name}/{number}/comments ("action": "post")',
2928
2928
  "/issue-comments": (
2929
2929
  "GET /issue/{repo_name}/{number}/comments, or POST the same path with "
2930
- '"action": "capture" / "sync"'
2930
+ '"action": "capture" / "sync" / "upsert"'
2931
2931
  ),
2932
2932
  "/assignment-usage": "PATCH /assignment/{assignment_id}",
2933
2933
  "/assignment-session-id": "PATCH /assignment/{assignment_id} (claude_session_id)",
@@ -3195,7 +3195,8 @@ def openapi_spec() -> dict:
3195
3195
  "summary": (
3196
3196
  "#1944: create or mirror one comment — the resource-shaped "
3197
3197
  "stand-in for POST /issue-comment (action=post, the default) "
3198
- "and POST /issue-comments (action=capture / action=sync)."
3198
+ "and POST /issue-comments (action=capture / action=sync / "
3199
+ "action=upsert, #2109)."
3199
3200
  ),
3200
3201
  "parameters": issue_path_params,
3201
3202
  "requestBody": {
@@ -9940,6 +9941,9 @@ def build_app(
9940
9941
  async def post_issue_comments(request: Request) -> Response:
9941
9942
  # #873: capture-at-write / backfill-sync into the durable
9942
9943
  # issue_comments mirror on the canonical DB.
9944
+ # #2109: also the ``"upsert"`` write for the merge-time verification
9945
+ # note — edits a standing marked comment in place rather than
9946
+ # posting a duplicate.
9943
9947
  from coord import state # noqa: PLC0415
9944
9948
 
9945
9949
  body = await _read_json(request)
@@ -9964,6 +9968,14 @@ def build_app(
9964
9968
  repo_github=body.get("repo_github"),
9965
9969
  )
9966
9970
  return JSONResponse({"synced": n})
9971
+ if action == "upsert":
9972
+ state._upsert_issue_comment_local(
9973
+ body["repo_name"],
9974
+ body["issue_number"],
9975
+ body["body"],
9976
+ repo_github=body.get("repo_github"),
9977
+ )
9978
+ return JSONResponse({"ok": True})
9967
9979
  except KeyError as e:
9968
9980
  return JSONResponse({"error": f"missing field: {e}"}, status_code=400)
9969
9981
  except Exception as e: # noqa: BLE001
@@ -10167,7 +10179,8 @@ def build_app(
10167
10179
  async def post_issue_comments_resource(request: Request) -> Response:
10168
10180
  """#1944: ``POST /issue/{repo}/{n}/comments`` — the resource-shaped
10169
10181
  stand-in for /issue-comment (``action="post"``, the default) and
10170
- /issue-comments (``action="capture"`` / ``"sync"``)."""
10182
+ /issue-comments (``action="capture"`` / ``"sync"`` / ``"upsert"``,
10183
+ #2109)."""
10171
10184
  from coord import state # noqa: PLC0415
10172
10185
 
10173
10186
  key = _resource_issue_key(request)
@@ -10184,11 +10197,11 @@ def build_app(
10184
10197
  {"error": f"unknown field(s): {', '.join(unknown)}"}, status_code=400
10185
10198
  )
10186
10199
  action = body.get("action") or "post"
10187
- if action not in ("post", "capture", "sync"):
10200
+ if action not in ("post", "capture", "sync", "upsert"):
10188
10201
  return JSONResponse(
10189
10202
  {"error": f"unknown action: {action!r}"}, status_code=400
10190
10203
  )
10191
- if action in ("post", "capture") and not body.get("body"):
10204
+ if action in ("post", "capture", "upsert") and not body.get("body"):
10192
10205
  return JSONResponse(
10193
10206
  {"error": f"body is required for action {action!r}"}, status_code=400
10194
10207
  )
@@ -10210,6 +10223,13 @@ def build_app(
10210
10223
  author=body.get("author"),
10211
10224
  created_at=body.get("created_at"),
10212
10225
  )
10226
+ elif action == "upsert":
10227
+ state._upsert_issue_comment_local(
10228
+ repo_name,
10229
+ number,
10230
+ body["body"],
10231
+ repo_github=body.get("repo_github"),
10232
+ )
10213
10233
  else:
10214
10234
  synced = state._sync_issue_comments_local(
10215
10235
  repo_name, number, repo_github=body.get("repo_github")