code-coordinator 0.5.522__tar.gz → 0.5.523__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 (911) hide show
  1. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/diagnose.py +526 -30
  5. code_coordinator-0.5.523/tests/test_stuck_test_state_watchdog_2803.py +1092 -0
  6. code_coordinator-0.5.522/tests/test_stuck_test_state_watchdog_2803.py +0 -456
  7. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.claude/commands/board.md +0 -0
  8. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.claude/commands/complete-session.md +0 -0
  9. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.claude/commands/coordinator.md +0 -0
  10. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.githooks/_lib.sh +0 -0
  11. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.githooks/post-checkout +0 -0
  12. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.githooks/post-commit +0 -0
  13. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.githooks/post-merge +0 -0
  14. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.github/coord-ci-acceptance.yml +0 -0
  16. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.github/workflows/auto-release.yml +0 -0
  17. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.github/workflows/publish.yml +0 -0
  18. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.github/workflows/test.yml +0 -0
  19. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/.gitignore +0 -0
  20. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/CLAUDE.md +0 -0
  21. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/GOAL.md +0 -0
  22. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/LICENSE +0 -0
  23. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/MANIFEST.in +0 -0
  24. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/README.md +0 -0
  25. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/code_coordinator.egg-info/SOURCES.txt +0 -0
  26. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/code_coordinator.egg-info/dependency_links.txt +0 -0
  27. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/code_coordinator.egg-info/entry_points.txt +0 -0
  28. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/code_coordinator.egg-info/requires.txt +0 -0
  29. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/code_coordinator.egg-info/scm_file_list.json +0 -0
  30. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/code_coordinator.egg-info/top_level.txt +0 -0
  31. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/__init__.py +0 -0
  32. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/_board_mapping.py +0 -0
  33. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/acceptance.py +0 -0
  34. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/acceptance_drivers.py +0 -0
  35. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/agent.py +0 -0
  36. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/agent_app.py +0 -0
  37. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/agent_update.py +0 -0
  38. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/agents/opencode/.gitignore +0 -0
  39. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/agents/opencode/agents/work.md +0 -0
  40. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/agents/opencode/routing.jsonc +0 -0
  41. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/approved_work.py +0 -0
  42. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/audit.py +0 -0
  43. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/auto_loop.py +0 -0
  44. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/backup.py +0 -0
  45. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/block_log.py +0 -0
  46. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/board_schema.py +0 -0
  47. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/board_service.py +0 -0
  48. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/board_wire.py +0 -0
  49. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/brain.py +0 -0
  50. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/branch_model.py +0 -0
  51. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/bug_intake.py +0 -0
  52. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/cargo_cache.py +0 -0
  53. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/ci_fix.py +0 -0
  54. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/ci_github.py +0 -0
  55. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/ci_gitlab.py +0 -0
  56. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/ci_store.py +0 -0
  57. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/claim.py +0 -0
  58. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/claude_setup_token.py +0 -0
  59. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/cli.py +0 -0
  60. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/client.py +0 -0
  61. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/codegen.py +0 -0
  62. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/__init__.py +0 -0
  63. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/_common.py +0 -0
  64. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/acceptance.py +0 -0
  65. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/agent_ops.py +0 -0
  66. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/audit.py +0 -0
  67. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/backup.py +0 -0
  68. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/ci.py +0 -0
  70. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/codegen.py +0 -0
  71. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/dispatch.py +0 -0
  72. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/dispatch_workers.py +0 -0
  73. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/dr.py +0 -0
  74. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/machine.py +0 -0
  81. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/merge.py +0 -0
  82. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/milestone.py +0 -0
  83. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/plan_followup.py +0 -0
  84. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/plans.py +0 -0
  85. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/portal.py +0 -0
  86. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/pr.py +0 -0
  87. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/release.py +0 -0
  88. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/repo.py +0 -0
  89. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/report.py +0 -0
  90. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/review.py +0 -0
  91. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/scorecard.py +0 -0
  92. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/sessions.py +0 -0
  93. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/setup.py +0 -0
  94. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/status.py +0 -0
  95. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/store_migrate.py +0 -0
  96. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/terminal.py +0 -0
  97. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/test_gate.py +0 -0
  98. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/commands/tui.py +0 -0
  99. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/comments.py +0 -0
  100. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/config.py +0 -0
  101. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/config_reload.py +0 -0
  102. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/confirm_test.py +0 -0
  103. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/conflict_fix.py +0 -0
  104. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dao.py +0 -0
  105. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dashboard/__init__.py +0 -0
  106. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dashboard/fixture.py +0 -0
  107. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dashboard/index.html +0 -0
  108. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dashboard/server.py +0 -0
  109. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dashboard/terminal.py +0 -0
  110. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/db.py +0 -0
  111. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dead_end.py +0 -0
  112. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/decomposition_chat.py +0 -0
  113. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/README.md +0 -0
  114. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-agent.service +0 -0
  115. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-backup.service +0 -0
  116. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-backup.timer +0 -0
  117. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-db-backup.service +0 -0
  118. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-db-backup.sh +0 -0
  119. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-db-backup.timer +0 -0
  120. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-dr-verify.service +0 -0
  121. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-dr-verify.timer +0 -0
  122. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-drive-queue.service +0 -0
  123. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-drive-queue.timer +0 -0
  124. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-failure-notify.service +0 -0
  125. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-fleet-watchdog.service +0 -0
  126. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  127. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-notify.service +0 -0
  128. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-notify.timer +0 -0
  129. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-release-propagate.service +0 -0
  130. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-release-propagate.timer +0 -0
  131. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-release-window.service +0 -0
  132. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-release-window.timer +0 -0
  133. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-serve.service +0 -0
  134. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-web-dist-build.service +0 -0
  135. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-web-dist-build.timer +0 -0
  136. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy/coord-web.service +0 -0
  137. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy_manifest.py +0 -0
  138. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deploy_units.py +0 -0
  139. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deprecation_telemetry.py +0 -0
  140. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/deps.py +0 -0
  141. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dispatch.py +0 -0
  142. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dispatch_liveness.py +0 -0
  143. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dist_name.py +0 -0
  144. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dr_promote.py +0 -0
  145. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/dr_verify.py +0 -0
  146. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/drive.py +0 -0
  147. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/drive_queue.py +0 -0
  148. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/drive_sessions_snapshot.py +0 -0
  149. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/drive_state.py +0 -0
  150. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/events.py +0 -0
  151. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/failure_class.py +0 -0
  152. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/failure_classifier.py +0 -0
  153. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/filelock.py +0 -0
  154. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/fleet_config_health.py +0 -0
  155. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/forge_availability.py +0 -0
  156. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/freshness.py +0 -0
  157. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/gate_a.py +0 -0
  158. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/gate_b.py +0 -0
  159. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/gate_snapshot.py +0 -0
  160. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/gates.py +0 -0
  161. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/gen_board_fixture.py +0 -0
  162. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/github_ops.py +0 -0
  163. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/github_throttle.py +0 -0
  164. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/goal.py +0 -0
  165. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/graph_health.py +0 -0
  166. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/__init__.py +0 -0
  167. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/aggregate.py +0 -0
  168. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/__init__.py +0 -0
  169. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/_ci_pin.py +0 -0
  170. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/agent_install.py +0 -0
  171. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/cargo_targets.py +0 -0
  172. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/claude_binary.py +0 -0
  173. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/config_drift.py +0 -0
  174. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  175. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/coord_web_ci_pin.py +0 -0
  176. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/deploy_lane_facts.py +0 -0
  177. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/disk.py +0 -0
  178. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/fleet_board.py +0 -0
  179. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  180. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/fleet_phantom.py +0 -0
  181. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/fleet_unit_drift.py +0 -0
  182. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/graph.py +0 -0
  183. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/graphify_cli.py +0 -0
  184. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/index_lock.py +0 -0
  185. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/issues_sync_staleness.py +0 -0
  186. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/local_machine_identity.py +0 -0
  187. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/plan_usage.py +0 -0
  188. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/pr_churn.py +0 -0
  189. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/release_cordon.py +0 -0
  190. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/repo_state.py +0 -0
  191. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/spawned_coord.py +0 -0
  192. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/stalled_pipeline.py +0 -0
  193. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/timer_active.py +0 -0
  194. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/toolchain.py +0 -0
  195. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/unit_drift.py +0 -0
  196. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/unit_enablement.py +0 -0
  197. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/wedged_drive_queue.py +0 -0
  198. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/checks/worktrees.py +0 -0
  199. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/cli.py +0 -0
  200. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/context.py +0 -0
  201. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/fleet_snapshot.py +0 -0
  202. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/models.py +0 -0
  203. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/pypi.py +0 -0
  204. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/registry.py +0 -0
  205. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/render.py +0 -0
  206. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/health/units.py +0 -0
  207. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/hooks.py +0 -0
  208. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/housekeeping.py +0 -0
  209. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/interactive.py +0 -0
  210. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/invariant_alarms.py +0 -0
  211. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/issue_store.py +0 -0
  212. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/issues_sync_status.py +0 -0
  213. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/liveness_auditor.py +0 -0
  214. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/machine_fault.py +0 -0
  215. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/machine_metrics.py +0 -0
  216. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/machine_onboard.py +0 -0
  217. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/machine_pause.py +0 -0
  218. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/machine_stats.py +0 -0
  219. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/merge_queue.py +0 -0
  220. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/milestone_chat.py +0 -0
  221. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/milestone_dispatch.py +0 -0
  222. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/milestone_gate.py +0 -0
  223. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/milestone_order.py +0 -0
  224. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/mock_author.py +0 -0
  225. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/models.py +0 -0
  226. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/network.py +0 -0
  227. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/new_issue_chat.py +0 -0
  228. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notifier/__init__.py +0 -0
  229. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notifier/baseline.py +0 -0
  230. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notifier/cli.py +0 -0
  231. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notifier/collect.py +0 -0
  232. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notifier/digest.py +0 -0
  233. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notifier/models.py +0 -0
  234. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notifier/predicate.py +0 -0
  235. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notifier/service.py +0 -0
  236. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notifier/store.py +0 -0
  237. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notifier/transport.py +0 -0
  238. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/notify.py +0 -0
  239. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/openapi.py +0 -0
  240. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/overlap_fence.py +0 -0
  241. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/overlap_predict.py +0 -0
  242. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/parentage.py +0 -0
  243. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/parentage_github.py +0 -0
  244. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/pipeline.py +0 -0
  245. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/plan_parser.py +0 -0
  246. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/plans.py +0 -0
  247. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/platform_paths.py +0 -0
  248. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/portal_bridge.py +0 -0
  249. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/portal_store.py +0 -0
  250. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/portal_sync.py +0 -0
  251. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/pr_body_lint.py +0 -0
  252. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/prereqs.py +0 -0
  253. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/progress.py +0 -0
  254. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/providers/__init__.py +0 -0
  255. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/providers/base.py +0 -0
  256. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/providers/claude.py +0 -0
  257. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/providers/claude_pty.py +0 -0
  258. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/providers/opencode.py +0 -0
  259. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/queue_diagnose.py +0 -0
  260. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/reconcile.py +0 -0
  261. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/reconcile_tick.py +0 -0
  262. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/refine_chat.py +0 -0
  263. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/release_cordon.py +0 -0
  264. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/release_propagate.py +0 -0
  265. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/release_verify.py +0 -0
  266. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/release_window.py +0 -0
  267. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/repo_dormancy.py +0 -0
  268. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/repo_edit.py +0 -0
  269. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/repo_onboard.py +0 -0
  270. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/reports.py +0 -0
  271. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/rest_schema.py +0 -0
  272. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/restart_cmd.py +0 -0
  273. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/revalidate.py +0 -0
  274. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/review.py +0 -0
  275. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/scorecard.py +0 -0
  276. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/self_health.py +0 -0
  277. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/serve_app.py +0 -0
  278. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  279. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  280. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  281. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  282. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  283. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/skills/portal-followup/SKILL.md +0 -0
  284. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/skills/release-now/SKILL.md +0 -0
  285. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  286. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  287. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/skills/update-issue/SKILL.md +0 -0
  288. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/smoke.py +0 -0
  289. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/spend_ceiling.py +0 -0
  290. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/split_work.py +0 -0
  291. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/sql.py +0 -0
  292. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/stage_projection.py +0 -0
  293. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/state.py +0 -0
  294. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/store_migrate.py +0 -0
  295. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/store_parity.py +0 -0
  296. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/templates/deploy-cloudflare.node.yml +0 -0
  297. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/test_author.py +0 -0
  298. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/test_chat.py +0 -0
  299. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/test_orchestrator.py +0 -0
  300. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/test_report.py +0 -0
  301. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/tui_release.py +0 -0
  302. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/uat_checks.py +0 -0
  303. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/usage.py +0 -0
  304. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/usage_limits.py +0 -0
  305. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/usage_rollup.py +0 -0
  306. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coord/worker_events.py +0 -0
  307. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/coordinator.example.yml +0 -0
  308. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-agent.service +0 -0
  309. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-backup.service +0 -0
  310. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-backup.timer +0 -0
  311. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-db-backup.service +0 -0
  312. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-db-backup.sh +0 -0
  313. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-db-backup.timer +0 -0
  314. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-dr-verify.service +0 -0
  315. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-dr-verify.timer +0 -0
  316. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-drive-queue.service +0 -0
  317. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-drive-queue.timer +0 -0
  318. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-failure-notify.service +0 -0
  319. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-failure-notify.sh +0 -0
  320. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-fleet-watchdog.service +0 -0
  321. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-fleet-watchdog.timer +0 -0
  322. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-notify.service +0 -0
  323. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-notify.timer +0 -0
  324. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-release-propagate.service +0 -0
  325. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-release-propagate.timer +0 -0
  326. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-release-window.service +0 -0
  327. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-release-window.timer +0 -0
  328. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-serve.service +0 -0
  329. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-web-dist-build.service +0 -0
  330. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-web-dist-build.sh +0 -0
  331. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-web-dist-build.timer +0 -0
  332. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-web-rollback.sh +0 -0
  333. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/coord-web.service +0 -0
  334. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/deploy/node-shim.sh +0 -0
  335. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/ADR_COORD_TUI_CI.md +0 -0
  336. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  337. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/ADR_COORD_WEB_CI.md +0 -0
  338. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/ADR_COORD_WEB_DIST.md +0 -0
  339. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  340. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/AGENT_OPERATIONS.md +0 -0
  341. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/ARCHITECTURE.md +0 -0
  342. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/ARCH_SECURITY_GATES.md +0 -0
  343. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/COCKPIT.md +0 -0
  344. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/CONTROL_CENTER.md +0 -0
  345. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/COST_DISCIPLINE.md +0 -0
  346. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/CROSS_PLATFORM.md +0 -0
  347. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/CUSTOMER_FACING_APPS.md +0 -0
  348. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/CUSTOMER_PORTAL.md +0 -0
  349. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/DATA_STORE_SELECTION.md +0 -0
  350. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/DISASTER_RECOVERY.md +0 -0
  351. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/DRIVE_QUEUE.md +0 -0
  352. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/EPHEMERAL_WORKERS.md +0 -0
  353. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/FORGE_MIGRATION.md +0 -0
  354. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/GRAPHIFY_SETUP.md +0 -0
  355. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/ISSUE_GUIDANCE.md +0 -0
  356. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/MAC_MINI.md +0 -0
  357. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  358. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/NOTIFIER.md +0 -0
  359. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/OPENCODE_VERIFICATION.md +0 -0
  360. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/OPERATING_GOTCHAS.md +0 -0
  361. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/OPERATOR_GUIDES.md +0 -0
  362. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/ORACLE_LOOP.md +0 -0
  363. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/PHONE_WEBAPP.md +0 -0
  364. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/PIPELINE_V2.md +0 -0
  365. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/PLATFORM_EVOLUTION.md +0 -0
  366. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/SECOND_BACKEND.md +0 -0
  367. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/STORE_SERVICE.md +0 -0
  368. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  369. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/WEB_CONTROL_CENTER.md +0 -0
  370. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/WSL_WINDOWS_WORKER.md +0 -0
  371. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/mocks/web/README.md +0 -0
  372. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/mocks/web/_tokens.css +0 -0
  373. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/mocks/web/issue-detail.html +0 -0
  374. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/mocks/web/pipeline-narrow.html +0 -0
  375. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/docs/mocks/web/pipeline-wide.html +0 -0
  376. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/graphify-out/.gitignore +0 -0
  377. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/install-agent.sh +0 -0
  378. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/pyproject.toml +0 -0
  379. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/audit_review_verdict_overrides.py +0 -0
  380. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  381. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/build-worker-image.sh +0 -0
  382. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/coordinator-machine.py +0 -0
  383. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/dr-down.sh +0 -0
  384. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/dr-up.sh +0 -0
  385. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/epic-down.sh +0 -0
  386. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/epic-up.sh +0 -0
  387. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/preflight.sh +0 -0
  388. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/provision-server.sh +0 -0
  389. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/provision-worker.sh +0 -0
  390. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  391. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  392. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/throwaway-vm.sh +0 -0
  393. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/azure-workers/verify-github-token.sh +0 -0
  394. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/check_gh_argv_containment.py +0 -0
  395. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/codegen.py +0 -0
  396. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/coord-test-runner.sh +0 -0
  397. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  398. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  399. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  400. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  401. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/coord-venv-rollback.sh +0 -0
  402. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/drive-batch.sh +0 -0
  403. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/extract-coord-tui.sh +0 -0
  404. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/fleet_watchdog.py +0 -0
  405. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/gen_board_fixture.py +0 -0
  406. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/gen_mock_index.py +0 -0
  407. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/lib/provision-core.sh +0 -0
  408. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/next_release_tag.py +0 -0
  409. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/provision-machine.sh +0 -0
  410. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/run_tests_in_populated_home.sh +0 -0
  411. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/run_tests_without_gh.sh +0 -0
  412. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/setup-macmini.sh +0 -0
  413. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/smoke_437_interactive.py +0 -0
  414. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/verify-provision-noble.sh +0 -0
  415. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/verify_878_review_capture.py +0 -0
  416. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/verify_release_published.py +0 -0
  417. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/scripts/verify_release_wheel.py +0 -0
  418. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/setup.cfg +0 -0
  419. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/SMOKE_SET.md +0 -0
  420. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/__init__.py +0 -0
  421. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-37/conftest.py +0 -0
  422. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-37/contract.md +0 -0
  423. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-37/manifest.yml +0 -0
  424. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  425. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  426. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-51/contract.md +0 -0
  427. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  428. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  429. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-51/manifest.yml +0 -0
  430. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  431. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-51/tsconfig.json +0 -0
  432. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  433. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/backends.py +0 -0
  434. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/conftest.py +0 -0
  435. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/board-pipeline-basic.json +0 -0
  436. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  437. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  438. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  439. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  440. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/playwright/all_pass.json +0 -0
  441. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  442. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/playwright/mixed_fail.json +0 -0
  443. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  444. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  445. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/playwright/skip.json +0 -0
  446. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/playwright/truncated.json +0 -0
  447. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  448. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  449. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  450. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  451. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  452. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  453. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  454. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  455. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_acceptance.py +0 -0
  456. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_acceptance_drivers.py +0 -0
  457. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent.py +0 -0
  458. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_api_error.py +0 -0
  459. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_app.py +0 -0
  460. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_branch_base.py +0 -0
  461. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_branch_capture.py +0 -0
  462. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_config_free_1712.py +0 -0
  463. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_deploy_units_endpoint.py +0 -0
  464. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_dirty_worktree.py +0 -0
  465. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  466. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_graph_self_heal.py +0 -0
  467. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_health_h3.py +0 -0
  468. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_idle_restart.py +0 -0
  469. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_push_failure.py +0 -0
  470. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_reap.py +0 -0
  471. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_repos_and_pull.py +0 -0
  472. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_restart_services_endpoint.py +0 -0
  473. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_skills_self_heal.py +0 -0
  474. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_startup_diagnostics.py +0 -0
  475. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_update.py +0 -0
  476. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_update_bluegreen.py +0 -0
  477. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_usage_limit.py +0 -0
  478. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_agent_zero_commit.py +0 -0
  479. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_ambient_home_isolation.py +0 -0
  480. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_approve_capability_reroute_3241.py +0 -0
  481. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_approve_dependency_busy_2804.py +0 -0
  482. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_approve_reject_plan.py +0 -0
  483. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_approve_usage_gate.py +0 -0
  484. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_approved_work_2532.py +0 -0
  485. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_approved_work_2996.py +0 -0
  486. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_assignment_already_recorded_daemon.py +0 -0
  487. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_audit_log.py +0 -0
  488. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_audit_outcome.py +0 -0
  489. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_audit_query.py +0 -0
  490. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_auto_loop.py +0 -0
  491. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_auto_release_publish_2035.py +0 -0
  492. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_backend_selection.py +0 -0
  493. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_backup.py +0 -0
  494. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_base_checkout_restore.py +0 -0
  495. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_block_log.py +0 -0
  496. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_board_cap_762.py +0 -0
  497. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_board_fixture.py +0 -0
  498. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_board_read_path.py +0 -0
  499. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_board_schema.py +0 -0
  500. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_board_service.py +0 -0
  501. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_board_state.py +0 -0
  502. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_board_wire.py +0 -0
  503. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_brain.py +0 -0
  504. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_branch_model.py +0 -0
  505. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_bug_intake.py +0 -0
  506. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_build_worker_image_env_update.py +0 -0
  507. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cargo_cache.py +0 -0
  508. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_check_gh_argv_containment.py +0 -0
  509. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_ci_acceptance_gate_1950.py +0 -0
  510. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_ci_fix.py +0 -0
  511. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_ci_github.py +0 -0
  512. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_ci_gitlab.py +0 -0
  513. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_ci_parity_2091.py +0 -0
  514. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_ci_store.py +0 -0
  515. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_claim.py +0 -0
  516. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_claude_md_budget.py +0 -0
  517. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_claude_setup_token.py +0 -0
  518. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_acceptance.py +0 -0
  519. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_assign.py +0 -0
  520. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  521. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_assign_interactive_remote.py +0 -0
  522. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_assign_provider.py +0 -0
  523. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  524. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_audit.py +0 -0
  525. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_chat_continue.py +0 -0
  526. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_ci.py +0 -0
  527. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_codegen.py +0 -0
  528. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_decide.py +0 -0
  529. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_diagnose_capability_rules.py +0 -0
  530. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_diagnose_config_provenance.py +0 -0
  531. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_diagnose_forge_availability.py +0 -0
  532. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_diagnose_graph.py +0 -0
  533. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_diagnose_self.py +0 -0
  534. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_diagnose_test_coverage.py +0 -0
  535. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_doctor.py +0 -0
  536. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_doctor_config_free_1801.py +0 -0
  537. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  538. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  539. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_drive.py +0 -0
  540. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_drive_queue.py +0 -0
  541. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_escalate.py +0 -0
  542. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_fix_headless_review.py +0 -0
  543. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_gate_a.py +0 -0
  544. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_install_drift.py +0 -0
  545. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_install_skills.py +0 -0
  546. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_issue_comment.py +0 -0
  547. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_issue_create_label.py +0 -0
  548. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_issue_reopen.py +0 -0
  549. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_issue_view_list.py +0 -0
  550. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_issues.py +0 -0
  551. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_merge.py +0 -0
  552. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_milestone_assign.py +0 -0
  553. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_milestone_capture.py +0 -0
  554. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_milestone_chat_add_child.py +0 -0
  555. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_milestone_dispatch.py +0 -0
  556. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_milestone_gate_b.py +0 -0
  557. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_milestone_gate_c.py +0 -0
  558. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_milestone_order.py +0 -0
  559. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  560. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_milestone_ship.py +0 -0
  561. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_network.py +0 -0
  562. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_new_issue_chat.py +0 -0
  563. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_plans.py +0 -0
  564. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_portal.py +0 -0
  565. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_pr.py +0 -0
  566. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_pull_artifact.py +0 -0
  567. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_queue.py +0 -0
  568. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_reattach_sessions.py +0 -0
  569. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_refine_board.py +0 -0
  570. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_release_preflight.py +0 -0
  571. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_release_propagate.py +0 -0
  572. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_release_window.py +0 -0
  573. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_repo_2220.py +0 -0
  574. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  575. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_scorecard.py +0 -0
  576. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_serve_store_backend_3084.py +0 -0
  577. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_set_review_findings.py +0 -0
  578. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_advisory_terminal.py +0 -0
  579. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_contested_tag.py +0 -0
  580. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_invariant_alarms.py +0 -0
  581. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_machine_fault.py +0 -0
  582. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_merge_queue.py +0 -0
  583. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_provider.py +0 -0
  584. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_retried_3340.py +0 -0
  585. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_review_finalizing.py +0 -0
  586. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_supervisor_3366.py +0 -0
  587. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_test_failed_tag.py +0 -0
  588. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_status_usage_limit.py +0 -0
  589. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_sync_comments_873.py +0 -0
  590. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_test_plan.py +0 -0
  591. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_track.py +0 -0
  592. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_tui_update.py +0 -0
  593. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cli_wait.py +0 -0
  594. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_client.py +0 -0
  595. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_client_base_install.py +0 -0
  596. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_client_config_cache_atomic_3052.py +0 -0
  597. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_client_resource_migration_1946.py +0 -0
  598. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_commands_common.py +0 -0
  599. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_comments.py +0 -0
  600. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_completion_summary.py +0 -0
  601. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_config.py +0 -0
  602. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_config_acceptance.py +0 -0
  603. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_config_audit.py +0 -0
  604. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_config_drift_check.py +0 -0
  605. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_config_effective.py +0 -0
  606. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_config_pricing.py +0 -0
  607. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  608. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_config_usage_gate.py +0 -0
  609. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_confirm_test.py +0 -0
  610. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_conflict_fix.py +0 -0
  611. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_conflict_fix_semantic.py +0 -0
  612. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  613. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_coord_test.py +0 -0
  614. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  615. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_coord_test_runner_baseline.py +0 -0
  616. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_coord_test_runner_populated_home.py +0 -0
  617. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_coord_test_runner_routing.py +0 -0
  618. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_coord_test_runner_toolchain.py +0 -0
  619. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_coord_uat.py +0 -0
  620. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_coord_web_sse_restart_live.py +0 -0
  621. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_coordinator_machine.py +0 -0
  622. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_cross_platform_imports.py +0 -0
  623. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dao.py +0 -0
  624. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dashboard.py +0 -0
  625. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dashboard_api.py +0 -0
  626. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dashboard_fixture.py +0 -0
  627. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dashboard_server.py +0 -0
  628. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dashboard_terminal.py +0 -0
  629. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dashboard_terminal_live.py +0 -0
  630. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_db.py +0 -0
  631. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dead_end.py +0 -0
  632. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_decomposition_chat.py +0 -0
  633. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deploy_coord_db_backup.py +0 -0
  634. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deploy_coord_web_dist.py +0 -0
  635. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deploy_coord_web_rollback.py +0 -0
  636. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deploy_db_backup_unit.py +0 -0
  637. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deploy_drive_queue_unit.py +0 -0
  638. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deploy_failure_notify_unit.py +0 -0
  639. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deploy_manifest.py +0 -0
  640. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deploy_notify_unit.py +0 -0
  641. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deploy_units_lane.py +0 -0
  642. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deploy_web_unit.py +0 -0
  643. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deprecation_telemetry.py +0 -0
  644. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_deps.py +0 -0
  645. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_diagnose.py +0 -0
  646. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dispatch.py +0 -0
  647. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dispatch_liveness.py +0 -0
  648. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dispatch_target_validation.py +0 -0
  649. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dispatch_workers.py +0 -0
  650. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dist_name.py +0 -0
  651. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_done_housekeeping.py +0 -0
  652. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dr_azure_scripts.py +0 -0
  653. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dr_promote.py +0 -0
  654. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_dr_verify.py +0 -0
  655. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive.py +0 -0
  656. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_machine_fault.py +0 -0
  657. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_queue.py +0 -0
  658. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_queue_blocked_rendering.py +0 -0
  659. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_queue_launch_argv.py +0 -0
  660. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_queue_max_parallel_config.py +0 -0
  661. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  662. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_queue_roll_pending.py +0 -0
  663. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  664. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_sessions_snapshot.py +0 -0
  665. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_state.py +0 -0
  666. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_drive_tmux.py +0 -0
  667. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_epic_up_capability_detection.py +0 -0
  668. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  669. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_epic_up_image_provenance.py +0 -0
  670. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_errors.py +0 -0
  671. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_events.py +0 -0
  672. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_failure_class.py +0 -0
  673. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_failure_classifier.py +0 -0
  674. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_filelock.py +0 -0
  675. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  676. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_fix_escalation_classifier.py +0 -0
  677. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_fix_of_force_override.py +0 -0
  678. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_fleet_config_health.py +0 -0
  679. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_fleet_health_probes.py +0 -0
  680. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_fleet_health_snapshot.py +0 -0
  681. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_fleet_watchdog.py +0 -0
  682. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_forge_availability.py +0 -0
  683. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_freshness.py +0 -0
  684. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_gate_a.py +0 -0
  685. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_gate_b.py +0 -0
  686. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_gate_snapshot_staleness.py +0 -0
  687. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_gates.py +0 -0
  688. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  689. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_gen_mock_index.py +0 -0
  690. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_generated_rust_fixture.py +0 -0
  691. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_generated_rust_requests.py +0 -0
  692. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_generated_types_fixture.py +0 -0
  693. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_github_ops.py +0 -0
  694. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_github_throttle.py +0 -0
  695. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_goal.py +0 -0
  696. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_graph_health.py +0 -0
  697. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_graph_selfheal_absent_2237.py +0 -0
  698. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_handoff.py +0 -0
  699. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_checks.py +0 -0
  700. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_cli.py +0 -0
  701. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_cli_graph.py +0 -0
  702. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_config.py +0 -0
  703. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_context.py +0 -0
  704. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_coord_tui_ci_pin.py +0 -0
  705. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_coord_web_ci_pin.py +0 -0
  706. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_deploy_lane_facts.py +0 -0
  707. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_fix.py +0 -0
  708. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_incident_regression.py +0 -0
  709. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_issues_sync_staleness.py +0 -0
  710. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_pr_churn.py +0 -0
  711. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_pypi.py +0 -0
  712. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_registry.py +0 -0
  713. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_release_cordon_probe.py +0 -0
  714. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_timer_active.py +0 -0
  715. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_toolchain.py +0 -0
  716. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_unit_drift.py +0 -0
  717. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_unit_enablement.py +0 -0
  718. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_health_wedged_drive_queue.py +0 -0
  719. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_hooks.py +0 -0
  720. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_housekeeping.py +0 -0
  721. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_human_attended_437.py +0 -0
  722. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_init.py +0 -0
  723. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_install_agent_venv_2911.py +0 -0
  724. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_integration.py +0 -0
  725. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_interactive.py +0 -0
  726. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_interactive_briefing_echo.py +0 -0
  727. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_interactive_pane_log_2541.py +0 -0
  728. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_interactive_prefill_state.py +0 -0
  729. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_interactive_session_relaunch.py +0 -0
  730. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_interactive_test_verdict_backstop.py +0 -0
  731. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_interactive_token_attribution.py +0 -0
  732. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_interactive_worktree.py +0 -0
  733. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_invariant_alarms.py +0 -0
  734. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_issue_store_seam.py +0 -0
  735. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_issues_sync_status.py +0 -0
  736. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_liveness_auditor.py +0 -0
  737. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_liveness_notify.py +0 -0
  738. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_lock_contention_ratchet.py +0 -0
  739. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_machine_fault.py +0 -0
  740. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_machine_metrics.py +0 -0
  741. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_machine_onboard.py +0 -0
  742. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_machine_pause.py +0 -0
  743. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_machine_stats.py +0 -0
  744. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_merge_queue.py +0 -0
  745. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_merge_verify.py +0 -0
  746. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_milestone_chat.py +0 -0
  747. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_milestone_dispatch.py +0 -0
  748. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_milestone_gate.py +0 -0
  749. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_milestone_order.py +0 -0
  750. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_milestone_seam.py +0 -0
  751. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_mock_author.py +0 -0
  752. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_model_tiering.py +0 -0
  753. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_models.py +0 -0
  754. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_models_config_labels.py +0 -0
  755. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_needs_attention.py +0 -0
  756. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_network.py +0 -0
  757. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_new_issue_chat.py +0 -0
  758. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_next_release_tag.py +0 -0
  759. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_node_shim.py +0 -0
  760. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notifier_baseline.py +0 -0
  761. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notifier_cli.py +0 -0
  762. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notifier_collect.py +0 -0
  763. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notifier_config.py +0 -0
  764. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notifier_drive_seam.py +0 -0
  765. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notifier_isolation.py +0 -0
  766. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notifier_predicate.py +0 -0
  767. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notifier_quiet_hours.py +0 -0
  768. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notifier_service.py +0 -0
  769. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notify.py +0 -0
  770. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_notify_drain.py +0 -0
  771. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_openapi.py +0 -0
  772. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_operational_defaults.py +0 -0
  773. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_overlap_fence.py +0 -0
  774. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_overlap_predict.py +0 -0
  775. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_packaged_deploy_units.py +0 -0
  776. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_parentage.py +0 -0
  777. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_paste_landed.py +0 -0
  778. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  779. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_pipeline.py +0 -0
  780. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_plan_followup_approve_plan_command.py +0 -0
  781. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_plan_followup_pr_command.py +0 -0
  782. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_plan_followup_review_command.py +0 -0
  783. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_plan_only.py +0 -0
  784. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_plan_parser.py +0 -0
  785. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_platform_paths.py +0 -0
  786. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_portal_bridge.py +0 -0
  787. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_portal_config.py +0 -0
  788. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_portal_store.py +0 -0
  789. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_portal_sync.py +0 -0
  790. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_pr_body_lint.py +0 -0
  791. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_prereqs.py +0 -0
  792. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_production_db_guard.py +0 -0
  793. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_progress.py +0 -0
  794. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_provider_seam.py +0 -0
  795. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_providers.py +0 -0
  796. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_providers_config_labels.py +0 -0
  797. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_providers_pty.py +0 -0
  798. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_provision_core.py +0 -0
  799. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_provision_machine.py +0 -0
  800. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_py_rust_mirror_inventory.py +0 -0
  801. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_quiet_hours.py +0 -0
  802. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_quiet_hours_store_2146.py +0 -0
  803. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reap_merged_sessions.py +0 -0
  804. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reap_stale_interactive_tick.py +0 -0
  805. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reconcile.py +0 -0
  806. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reconcile_branch.py +0 -0
  807. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reconcile_completions.py +0 -0
  808. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  809. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reconcile_merges.py +0 -0
  810. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reconcile_no_agent_record.py +0 -0
  811. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reconcile_tick.py +0 -0
  812. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reconcile_usage_limit_done.py +0 -0
  813. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_refine_chat.py +0 -0
  814. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_cordon_2101.py +0 -0
  815. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  816. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_cordon_deadlock_2240.py +0 -0
  817. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  818. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_cordon_stuck_2490.py +0 -0
  819. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_propagate.py +0 -0
  820. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_propagate_threshold.py +0 -0
  821. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_roll_between_legs_2854.py +0 -0
  822. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_roll_window_handoff.py +0 -0
  823. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_unified_1242.py +0 -0
  824. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_verify.py +0 -0
  825. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_release_window.py +0 -0
  826. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_remote_auto_prune.py +0 -0
  827. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_remote_interactive_reaper.py +0 -0
  828. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_repo_add.py +0 -0
  829. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_repo_dormancy.py +0 -0
  830. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_repo_edit_2220.py +0 -0
  831. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_repo_graph_fleet_2237.py +0 -0
  832. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_repo_max_parallel_3423.py +0 -0
  833. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_repo_onboard_2220.py +0 -0
  834. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_report_result_push.py +0 -0
  835. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_reports.py +0 -0
  836. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_restart_cmd.py +0 -0
  837. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_retry.py +0 -0
  838. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_retry_advisory_1606.py +0 -0
  839. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_retry_escalation_classify_3360.py +0 -0
  840. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_retry_type_1636.py +0 -0
  841. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_revalidate.py +0 -0
  842. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_review.py +0 -0
  843. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_review_end_review_without_verdict.py +0 -0
  844. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_review_parse_failure_diagnostic.py +0 -0
  845. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_review_reaffirm.py +0 -0
  846. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_review_state.py +0 -0
  847. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_review_verdict_backstop.py +0 -0
  848. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_review_verdict_override_audit.py +0 -0
  849. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_review_verdict_relay.py +0 -0
  850. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_review_zero_commits.py +0 -0
  851. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_scoped_review_wiring.py +0 -0
  852. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_scorecard.py +0 -0
  853. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_self_health.py +0 -0
  854. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_serve.py +0 -0
  855. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_serve_app.py +0 -0
  856. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_serve_app_board_trim.py +0 -0
  857. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_serve_rest_routes.py +0 -0
  858. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_session.py +0 -0
  859. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_slice_issue_attribution.py +0 -0
  860. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_smoke.py +0 -0
  861. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  862. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_smoke_live_checkout_restore.py +0 -0
  863. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_smoke_workflow.py +0 -0
  864. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_spend_ceiling.py +0 -0
  865. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_spend_ceiling_coordinator.py +0 -0
  866. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_split.py +0 -0
  867. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_split_work.py +0 -0
  868. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_sql_dialect.py +0 -0
  869. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_sqlite_connect_ratchet.py +0 -0
  870. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_stage_projection.py +0 -0
  871. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_stale_busy_reviewer_697.py +0 -0
  872. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_stalled_pipeline.py +0 -0
  873. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_state.py +0 -0
  874. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_state_review_findings_daemon.py +0 -0
  875. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_status_fleet_footer.py +0 -0
  876. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_stop_1567.py +0 -0
  877. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_store_contract.py +0 -0
  878. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_store_migrate.py +0 -0
  879. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_stuck.py +0 -0
  880. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_terminal_command.py +0 -0
  881. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_test_author.py +0 -0
  882. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_test_chat.py +0 -0
  883. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_test_orchestrator.py +0 -0
  884. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_test_report.py +0 -0
  885. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_test_verdict_parsing.py +0 -0
  886. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_test_verdict_transcript_floor.py +0 -0
  887. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_text_io_encoding_audit.py +0 -0
  888. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_thin_client_board_audit.py +0 -0
  889. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_thin_client_config_load_1080.py +0 -0
  890. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_thin_client_daemon_routing_906.py +0 -0
  891. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_throwaway_vm.py +0 -0
  892. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_tmux_host.py +0 -0
  893. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_tmux_session.py +0 -0
  894. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_transcript_floor.py +0 -0
  895. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_uat_checks.py +0 -0
  896. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_usage.py +0 -0
  897. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_usage_limits.py +0 -0
  898. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_usage_rollup.py +0 -0
  899. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_venv_live_install_2121.py +0 -0
  900. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_version_single_source.py +0 -0
  901. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_watch.py +0 -0
  902. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  903. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_worker_env_venv_isolation.py +0 -0
  904. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_worker_events.py +0 -0
  905. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_worker_image_pin_sync.py +0 -0
  906. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_worker_safety.py +0 -0
  907. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_worker_test_scoping.py +0 -0
  908. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_worktree.py +0 -0
  909. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  910. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/tests/test_write_parity.py +0 -0
  911. {code_coordinator-0.5.522 → code_coordinator-0.5.523}/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.522
3
+ Version: 0.5.523
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.522
3
+ Version: 0.5.523
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.522",
2
+ "tag": "0.5.523",
3
3
  "distance": 0,
4
- "node": "g3d51cf0a782a606306c6175a5b2271d2d93ea2d4",
4
+ "node": "geeb81f140eb64e517c8fde27adf71ba0186f28da",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-27"
@@ -2340,6 +2340,71 @@ class StuckTestStateHeal:
2340
2340
  action: str = ""
2341
2341
 
2342
2342
 
2343
+ #: Sentinel anchor id for :func:`_stuck_test_state_heal_marker` /
2344
+ #: :func:`_already_healed_against` when there is no Test-stage child at all
2345
+ #: (:func:`_latest_smoke_child` returned ``None``) — the "no child found"
2346
+ #: classification in :func:`sweep_stuck_test_state_rows` has no real
2347
+ #: assignment id to key the re-heal guard on, so it uses this fixed string
2348
+ #: instead. Never collides with a real assignment id (those are
2349
+ #: ``uuid.uuid4().hex``-derived, never this literal).
2350
+ _NO_SMOKE_CHILD_MARKER_ID = "no-smoke-child"
2351
+
2352
+
2353
+ def _stuck_test_state_heal_marker(child_assignment_id: str) -> str:
2354
+ """The marker embedded in a parent row's ``test_reason`` recording that
2355
+ *this exact* Test-stage child (or, for
2356
+ :data:`_NO_SMOKE_CHILD_MARKER_ID`, the "no child at all" case) was
2357
+ already resolved by this sweep (#3453).
2358
+
2359
+ Before this, a parent whose ``test_state`` reads ``"running"`` again
2360
+ (whatever re-stamps it without ever dispatching a fresh Test-stage
2361
+ child — #3453 does not chase that separate bug, only guards against its
2362
+ consequence here) with the SAME latest child still on file (or still no
2363
+ child at all) would be "healed" all over again on the very next tick:
2364
+ :func:`_latest_smoke_child` has nothing new to return, so the anchor is
2365
+ still hours past :data:`STUCK_TEST_STATE_GRACE_SECONDS` and the row
2366
+ re-heals immediately — quadraui#1077 posted ``stuck_test_state_healed``
2367
+ five times in five minutes naming the identical child, each firing
2368
+ spending one more tick of the #3315 environmental-retry budget until it
2369
+ parked a branch whose Test stage had, in fact, already passed.
2370
+
2371
+ Checked via :func:`_already_healed_against` before any write for this
2372
+ child is attempted — a parent whose current ``test_reason`` already
2373
+ carries this marker for the CURRENT latest child (or the "no child"
2374
+ sentinel) is left alone: no write, no tally, no duplicate heal.
2375
+
2376
+ Every classification branch in :func:`sweep_stuck_test_state_rows` embeds
2377
+ this marker and checks the guard — not just the ``status=="done"`` one.
2378
+ The #3182 fan-out sub-case cannot build its own ``test_reason`` (that text
2379
+ belongs to :func:`coord.smoke.finalize_smoke_fanout`), so it stamps the
2380
+ marker on in a second, verdict-preserving write via
2381
+ :func:`_stamp_fanout_heal_marker`. The ``failed``/``cancelled`` branch's
2382
+ recovery text is folded
2383
+ through :func:`coord.reconcile.propagate_smoke_terminal_failure`, which
2384
+ classifies environmental-vs-work itself (#1590): when that classifies as
2385
+ WORK, the marker (embedded in the ``failure_reason`` passed through)
2386
+ lands verbatim in the row's final ``test_reason`` and the guard is fully
2387
+ effective on the next tick; when it classifies as ENVIRONMENTAL instead,
2388
+ that function's own environmental-branch text is built from its
2389
+ *classification*, not the raw ``failure_reason`` string handed to it, so
2390
+ the marker does not survive into the written ``test_reason`` for that
2391
+ sub-case. That narrower gap is a `coord.reconcile` seam limitation, not
2392
+ something this module can close without changing a function shared by
2393
+ `_recover_test`/`_reconcile_no_agent_record` — tracked, not silently
2394
+ dropped.
2395
+ """
2396
+ return f"[[stuck-test-state-healed:{child_assignment_id}]]"
2397
+
2398
+
2399
+ def _already_healed_against(test_reason: str | None, child_assignment_id: str) -> bool:
2400
+ """``True`` when *test_reason* already carries the #3453 marker for
2401
+ *child_assignment_id* — i.e. this sweep already resolved the parent
2402
+ against this exact Test-stage child (or, for
2403
+ :data:`_NO_SMOKE_CHILD_MARKER_ID`, the "no child at all" case) once and
2404
+ must not do it again."""
2405
+ return bool(test_reason) and _stuck_test_state_heal_marker(child_assignment_id) in test_reason
2406
+
2407
+
2343
2408
  def _latest_smoke_child(board: "Board", parent_id: str) -> "Assignment | None":
2344
2409
  """The most recently dispatched ``type="smoke"`` row for *parent_id*, or
2345
2410
  ``None``.
@@ -2364,6 +2429,67 @@ def _latest_smoke_child(board: "Board", parent_id: str) -> "Assignment | None":
2364
2429
  return max(candidates, key=lambda a: a.dispatched_at or 0.0)
2365
2430
 
2366
2431
 
2432
+ def _stamp_fanout_heal_marker(
2433
+ parent_id: str, observed_state: str, child_assignment_id: str,
2434
+ ) -> None:
2435
+ """Append this sweep's #3453 re-heal marker for *child_assignment_id* to a
2436
+ fan-out parent's ``test_reason``, leaving *observed_state* and the rest of
2437
+ the text (crucially the leading ``[[smoke-fanout:...]]`` manifest) intact.
2438
+
2439
+ :func:`coord.smoke.finalize_smoke_fanout` owns the fan-out parent's
2440
+ ``test_reason`` and writes its own text (manifest line, headline, per-leg
2441
+ summary) with no knowledge of this module's marker — so the
2442
+ ``fanout_finalize`` branch of :func:`sweep_stuck_test_state_rows` cannot
2443
+ embed the marker the way the other three classification branches do
2444
+ (they build the ``failure_reason``/``test_reason`` string themselves).
2445
+ This stamps it on in a second, verdict-preserving write instead, so the
2446
+ :func:`_already_healed_against` guard is as effective for fan-out parents
2447
+ as it is everywhere else.
2448
+
2449
+ Purely a duplicate-heal suppressor: best-effort, never raises, and never
2450
+ changes the verdict. The marker is APPENDED so the manifest stays at
2451
+ position 0 where :func:`coord.smoke._parse_fanout_manifest` (an anchored
2452
+ ``match``) still finds it. A ``test_reason`` that reads back as ``None``
2453
+ (absent row, NULL column, or a degraded remote read — indistinguishable
2454
+ through this seam) is left completely alone rather than overwritten with a
2455
+ bare marker: dropping a real aggregate's headline and manifest to win a
2456
+ duplicate-comment guard would be a far worse trade.
2457
+ """
2458
+ from coord.state import ( # noqa: PLC0415
2459
+ load_assignment_test_reason,
2460
+ record_test_verdict,
2461
+ )
2462
+
2463
+ marker = _stuck_test_state_heal_marker(child_assignment_id)
2464
+ try:
2465
+ reason = load_assignment_test_reason(parent_id)
2466
+ if reason is None:
2467
+ log.warning(
2468
+ "sweep_stuck_test_state_rows: finalized the fan-out verdict "
2469
+ "for %s but could not read its test_reason back to stamp the "
2470
+ "#3453 re-heal marker — leaving the reason untouched",
2471
+ parent_id,
2472
+ )
2473
+ return
2474
+ if marker in reason:
2475
+ return
2476
+ record_test_verdict(
2477
+ assignment_id=parent_id,
2478
+ test_state=observed_state,
2479
+ test_reason=f"{reason}\n{marker}",
2480
+ )
2481
+ except Exception as exc: # noqa: BLE001 — never sink the sweep
2482
+ # The fold itself already landed and was confirmed; failing to stamp
2483
+ # the marker only risks ONE duplicate heal report on a later tick if
2484
+ # something re-stamps `test_state` back to `running`. Never worth
2485
+ # losing the heal we did achieve.
2486
+ log.warning(
2487
+ "sweep_stuck_test_state_rows: could not stamp the #3453 re-heal "
2488
+ "marker on %s (%s) — the fan-out verdict itself stands",
2489
+ parent_id, exc,
2490
+ )
2491
+
2492
+
2367
2493
  def sweep_stuck_test_state_rows(
2368
2494
  board: "Board",
2369
2495
  config: "Config",
@@ -2390,10 +2516,42 @@ def sweep_stuck_test_state_rows(
2390
2516
  work, decided by :func:`coord.failure_class.classify_failure` from the
2391
2517
  child's own ``failure_reason``), just fleet-wide and automatic instead
2392
2518
  of issue-scoped and manual.
2393
- * **Child reached ``status == "done"``** — the child itself believes it
2394
- succeeded, but the parent's verdict write never landed. Always
2395
- resolved environmentally: a lost write is a coordinator/infra fault,
2396
- never a code defect.
2519
+ * **Child reached ``status == "done"`` with its own recorded verdict**
2520
+ (``test_state`` already ``"passed"``/``"failed"``/``"skipped"``/
2521
+ :data:`coord.smoke.TEST_STATE_BLOCKED` on the CHILD's own row — all four
2522
+ of the terminal verdicts ``finalize_smoke_fanout``'s own severity fold
2523
+ recognizes, ``"blocked"`` very much included: #2272's mute-leg path
2524
+ terminates a leg with exactly ``status="done"``,
2525
+ ``test_state="blocked"``) — the write that was lost is the FOLD onto the
2526
+ parent, not the verdict itself (#3453). For a single-leg row, propagate
2527
+ that recorded verdict onto the parent verbatim; never re-classify it as
2528
+ environmental and never spend a #3315 retry-budget tally on it —
2529
+ nothing died, a verdict just never reached the row that gates the
2530
+ merge. **For a #3182 fan-out parent** (its ``test_reason`` carries a
2531
+ ``[[smoke-fanout:...]]`` manifest, :func:`coord.smoke._parse_fanout_manifest`)
2532
+ the latest child found here is only ONE capability-partition leg —
2533
+ :func:`_latest_smoke_child` picks it purely by ``dispatched_at``, which
2534
+ says nothing about whether every OTHER leg in the manifest has
2535
+ reported, let alone what any of them said. Propagating that one leg's
2536
+ verdict verbatim would let whichever leg happens to have been
2537
+ dispatched last silently decide the whole row's aggregate, masking a
2538
+ still-running or already-FAILED sibling. This sweep never does that:
2539
+ for a fan-out parent it instead defers to
2540
+ :func:`coord.smoke.finalize_smoke_fanout` — the one place that already
2541
+ folds every named leg with worst-wins severity
2542
+ (``failed`` > ``blocked`` > ``skipped`` > ``passed``) — and only
2543
+ reports (or, live, writes) a heal once every leg in the manifest is
2544
+ itself terminal; while any sibling is still outstanding this is a
2545
+ silent no-op each tick, spending no write and no #3315 tally. It is
2546
+ also a silent no-op when a live re-read shows the parent already
2547
+ carries a terminal verdict (a human's ``coord test`` override, or
2548
+ another process's fold): ``finalize_smoke_fanout`` protects that value,
2549
+ so reporting a heal for it would credit this sweep with a verdict it
2550
+ did not produce.
2551
+ * **Child reached ``status == "done"`` with no verdict of its own
2552
+ either** — genuinely lost: the child itself believes it succeeded but
2553
+ never recorded why. Resolved environmentally: a lost write is a
2554
+ coordinator/infra fault, never a code defect.
2397
2555
  * **Child still ``running``/``pending`` itself, or nothing to anchor an
2398
2556
  age from** — left alone. A child that is still genuinely executing
2399
2557
  (or phantom-dead) is :func:`sweep_dead_running_rows`'s /
@@ -2408,18 +2566,37 @@ def sweep_stuck_test_state_rows(
2408
2566
  Test-stage completion has an expected, bounded propagation lag before
2409
2567
  its verdict lands on the parent, and that lag is not this bug.
2410
2568
 
2411
- Recovery is always :func:`coord.reconcile.propagate_smoke_terminal_failure`
2412
- — the same, already-reviewed seam ``_recover_test`` and
2413
- ``_reconcile_no_agent_record`` both use. It never fabricates a pass/fail
2414
- verdict: an environmental clear resets ``test_state`` back to ``NULL``
2415
- so ``dispatch_pending_smoke``'s ordinary bookkeeping (already run every
2416
- daemon tick) re-dispatches a fresh Test stage on its own next pass; a
2417
- work classification records ``test_state="failed"`` exactly like a
2418
- normal non-zero-exit smoke completion would have, spending a bounded
2419
- ``coord fix`` round exactly as it should have if the write had landed on
2420
- time. Writes go through ``coord.state.record_test_verdict`` directly
2421
- (not ``save_board``), so this function never mutates *board* and the
2422
- caller does not need to persist it.
2569
+ #3453: a ``status == "done"`` child is additionally checked against
2570
+ :func:`_already_healed_against` before anything else — a parent whose
2571
+ current ``test_reason`` already carries the #3453 marker naming THIS
2572
+ exact child is left alone entirely (no write, no tally, not even a
2573
+ dry-run finding), because the row was already resolved once and
2574
+ something (out of this sweep's control) re-stamped ``test_state`` back
2575
+ to ``"running"`` without ever dispatching a fresh child for
2576
+ :func:`_latest_smoke_child` to find instead.
2577
+
2578
+ Recovery for the environmental/work classifications is
2579
+ :func:`coord.reconcile.propagate_smoke_terminal_failure` — the same,
2580
+ already-reviewed seam ``_recover_test`` and ``_reconcile_no_agent_record``
2581
+ both use. It never fabricates a pass/fail verdict: an environmental clear
2582
+ resets ``test_state`` back to ``NULL`` so ``dispatch_pending_smoke``'s
2583
+ ordinary bookkeeping (already run every daemon tick) re-dispatches a
2584
+ fresh Test stage on its own next pass; a work classification records
2585
+ ``test_state="failed"`` exactly like a normal non-zero-exit smoke
2586
+ completion would have, spending a bounded ``coord fix`` round exactly as
2587
+ it should have if the write had landed on time. The recorded-verdict case
2588
+ above instead writes straight through ``coord.state.record_test_verdict``
2589
+ with the child's own ``test_state`` — the propagation the lost write
2590
+ should have performed, nothing more. Every write here goes through
2591
+ ``coord.state.record_test_verdict`` (directly, or via
2592
+ ``propagate_smoke_terminal_failure``'s own use of it) rather than
2593
+ ``save_board``, so this function never mutates *board* and the caller
2594
+ does not need to persist it. That propagation is then **confirmed by a
2595
+ re-read** (``coord.state.load_assignment_test_state``) before it is
2596
+ reported as healed (#2096) — a write that raised nothing but left no
2597
+ observable verdict on the parent yields no
2598
+ :class:`StuckTestStateHeal`, because the lost-write class this watchdog
2599
+ exists for (#2802) is exactly the one that raises nothing.
2423
2600
 
2424
2601
  Returns one :class:`StuckTestStateHeal` per row actually healed (or, when
2425
2602
  *dry_run*, per row that WOULD be healed). A row whose recovery write
@@ -2430,6 +2607,7 @@ def sweep_stuck_test_state_rows(
2430
2607
  tick (or a human via ``coord diagnose --stage test``) to retry.
2431
2608
  """
2432
2609
  from coord.models import WORK_LIKE_TYPES # noqa: PLC0415
2610
+ from coord.smoke import TEST_STATE_BLOCKED, _parse_fanout_manifest # noqa: PLC0415
2433
2611
 
2434
2612
  if now is None:
2435
2613
  now = time.time()
@@ -2447,15 +2625,40 @@ def sweep_stuck_test_state_rows(
2447
2625
 
2448
2626
  smoke = _latest_smoke_child(board, w.assignment_id)
2449
2627
 
2628
+ recorded_verdict: str | None = None # #3453: set only when the child's
2629
+ # OWN row already carries a real "passed"/"failed"/"skipped" verdict —
2630
+ # the correct recovery is then to PROPAGATE it, never to discard it.
2631
+
2632
+ fanout_finalize = False # #3453 review: set only when the parent is a
2633
+ # #3182 fan-out round and the latest child's own verdict must defer
2634
+ # to `finalize_smoke_fanout`'s manifest-aware fold instead of being
2635
+ # propagated verbatim (a single leg is never the whole row's answer).
2636
+
2450
2637
  if smoke is None:
2638
+ # #3453: mirror the `status=="done"` branch's re-heal guard — a
2639
+ # parent that already carries this marker was resolved once with
2640
+ # no Test-stage child present at all and must not be re-healed
2641
+ # every tick just because something re-stamped `test_state` back
2642
+ # to "running" without ever dispatching a fresh child (the same
2643
+ # quadraui#1077 failure mode is reachable here too).
2644
+ if _already_healed_against(w.test_reason, _NO_SMOKE_CHILD_MARKER_ID):
2645
+ continue
2451
2646
  anchor = w.finished_at or w.dispatched_at
2452
2647
  cause = "no Test-stage (smoke) assignment exists for this work row at all"
2453
2648
  environmental: bool | None = True
2454
2649
  failure_reason = (
2455
2650
  "watchdog (#2803): test_state='running' with no Test-stage "
2456
- "assignment found at all"
2651
+ "assignment found at all. "
2652
+ f"{_stuck_test_state_heal_marker(_NO_SMOKE_CHILD_MARKER_ID)}"
2457
2653
  )
2458
2654
  elif (smoke.status or "") in ("failed", "cancelled"):
2655
+ # #3453: same re-heal guard, keyed on this child. See
2656
+ # `_stuck_test_state_heal_marker`'s docstring for why the marker
2657
+ # is not guaranteed to survive into the written `test_reason`
2658
+ # for the ENVIRONMENTAL sub-classification of this branch (a
2659
+ # `coord.reconcile` seam limitation, not skipped here).
2660
+ if _already_healed_against(w.test_reason, smoke.assignment_id):
2661
+ continue
2459
2662
  anchor = smoke.finished_at or smoke.dispatched_at
2460
2663
  cause = (
2461
2664
  f"Test-stage worker {smoke.assignment_id} already finished "
@@ -2464,21 +2667,97 @@ def sweep_stuck_test_state_rows(
2464
2667
  "verdict was never propagated to the parent"
2465
2668
  )
2466
2669
  environmental = None # classify from failure_reason, like `_recover_test`
2467
- failure_reason = smoke.failure_reason
2468
- elif smoke.status == "done":
2469
- anchor = smoke.finished_at or smoke.dispatched_at
2470
- cause = (
2471
- f"Test-stage worker {smoke.assignment_id} finished "
2472
- "(status='done') but no verdict was ever recorded on the "
2473
- "parent row"
2474
- )
2475
- environmental = True
2476
2670
  failure_reason = (
2477
- f"watchdog (#2803): Test-stage worker {smoke.assignment_id} "
2478
- "finished but the parent verdict write never landed (the "
2479
- "DB-lock class of loss, #2802) — cleared for a fresh "
2480
- "Test-stage dispatch"
2671
+ f"{smoke.failure_reason or cause}. "
2672
+ f"{_stuck_test_state_heal_marker(smoke.assignment_id)}"
2481
2673
  )
2674
+ elif smoke.status == "done":
2675
+ # #3453: never re-heal against the SAME child this sweep already
2676
+ # resolved — see `_stuck_test_state_heal_marker`'s docstring for
2677
+ # the quadraui#1077 incident this guards.
2678
+ if _already_healed_against(w.test_reason, smoke.assignment_id):
2679
+ continue
2680
+ anchor = smoke.finished_at or smoke.dispatched_at
2681
+ # #3453 review: `TEST_STATE_BLOCKED` ("blocked") belongs in this
2682
+ # set too — it is a first-class RECORDED terminal verdict, not an
2683
+ # absent one. `coord.smoke.finalize_smoke_fanout` already treats
2684
+ # it as one in both its severity fold
2685
+ # (`{"failed": 3, TEST_STATE_BLOCKED: 2, "skipped": 1,
2686
+ # "passed": 0}`) and its manifest-merge guard, and
2687
+ # `coord.notify._record_smoke_verdict`'s #2272 mute-leg path
2688
+ # terminates a leg's OWN row with exactly
2689
+ # `status="done", test_state=TEST_STATE_BLOCKED` — a deliberate
2690
+ # "park until a human runs `coord diagnose --stage test --reset`,
2691
+ # never re-dispatch" verdict. Omitting it here sent that row down
2692
+ # the `else` below: classified environmental, cleared back to
2693
+ # NULL, one #3315 tally spent, the specific diagnostic reason
2694
+ # discarded, and a fresh Test dispatch triggered — i.e. the exact
2695
+ # silent-discard defect #3453 exists to fix, reintroduced for one
2696
+ # verdict, plus the precise re-dispatch loop `TEST_STATE_BLOCKED`
2697
+ # was designed to stop. Kept as one set rather than a narrower,
2698
+ # silently-inconsistent copy — the same shape `STAGE_ASSIGNMENT_TYPES["test"]`
2699
+ # above was already bitten by once (#3305).
2700
+ if smoke.test_state in ("passed", "failed", "skipped", TEST_STATE_BLOCKED):
2701
+ fanout_legs = _parse_fanout_manifest(w.test_reason)
2702
+ if fanout_legs:
2703
+ # #3453 review: this parent is a #3182 fan-out round —
2704
+ # the latest smoke CHILD is only ONE partition leg, and
2705
+ # `_latest_smoke_child` picks it purely by
2706
+ # `dispatched_at`, independent of how long any leg's own
2707
+ # suite actually runs. Propagating ITS verdict verbatim
2708
+ # (as the single-leg case below correctly does) would
2709
+ # let whichever leg happens to have the greatest
2710
+ # `dispatched_at` silently decide the whole row's
2711
+ # aggregate — masking a still-running or already-FAILED
2712
+ # sibling partition. Defer entirely to
2713
+ # `coord.smoke.finalize_smoke_fanout`, the one place
2714
+ # that already folds every leg with worst-wins severity
2715
+ # (`failed` > `blocked` > `skipped` > `passed`), and only
2716
+ # once every leg named in the manifest is terminal.
2717
+ fanout_finalize = True
2718
+ environmental = None
2719
+ failure_reason = None
2720
+ cause = (
2721
+ f"Test-stage worker {smoke.assignment_id} (a #3182 "
2722
+ "fan-out leg) finished (status='done') with its own "
2723
+ f"recorded verdict test_state={smoke.test_state!r}, "
2724
+ "but this parent is a fan-out round — deferring to "
2725
+ "finalize_smoke_fanout's manifest-aware aggregation "
2726
+ "across every leg instead of propagating one leg's "
2727
+ "verdict"
2728
+ )
2729
+ else:
2730
+ # Single-leg row — the child's own row already carries a
2731
+ # real verdict — the write that was lost is the FOLD
2732
+ # onto the parent, not the verdict itself. Propagate it
2733
+ # verbatim; this is never an environmental death
2734
+ # (nothing died) and must never spend a #3315
2735
+ # retry-budget tally.
2736
+ recorded_verdict = smoke.test_state
2737
+ environmental = None
2738
+ failure_reason = None
2739
+ cause = (
2740
+ f"Test-stage worker {smoke.assignment_id} finished "
2741
+ f"(status='done') with its own recorded verdict "
2742
+ f"test_state={smoke.test_state!r}, but that verdict "
2743
+ "never landed on the parent row (the #2802 "
2744
+ "lost-write class) — propagating it now instead of "
2745
+ "discarding it for a fresh dispatch"
2746
+ )
2747
+ else:
2748
+ cause = (
2749
+ f"Test-stage worker {smoke.assignment_id} finished "
2750
+ "(status='done') but no verdict was ever recorded on the "
2751
+ "parent row"
2752
+ )
2753
+ environmental = True
2754
+ failure_reason = (
2755
+ f"watchdog (#2803): Test-stage worker {smoke.assignment_id} "
2756
+ "finished but the parent verdict write never landed (the "
2757
+ "DB-lock class of loss, #2802) — cleared for a fresh "
2758
+ "Test-stage dispatch. "
2759
+ f"{_stuck_test_state_heal_marker(smoke.assignment_id)}"
2760
+ )
2482
2761
  else:
2483
2762
  continue # still running/pending — not this sweep's job
2484
2763
 
@@ -2494,6 +2773,223 @@ def sweep_stuck_test_state_rows(
2494
2773
  "window)"
2495
2774
  )
2496
2775
 
2776
+ if fanout_finalize:
2777
+ # #3453 review: never write a single leg's verdict onto a
2778
+ # fan-out parent. Peek at every leg named in the manifest
2779
+ # read-only first — this is the only way to know whether
2780
+ # `finalize_smoke_fanout` would actually fold anything right
2781
+ # now (it silently no-ops until every leg is terminal), so a
2782
+ # dry-run can report accurately and a live run spends no tally
2783
+ # and no write while siblings are still outstanding.
2784
+ from coord.state import load_assignment_test_state # noqa: PLC0415
2785
+
2786
+ manifest_legs = _parse_fanout_manifest(w.test_reason) or []
2787
+ try:
2788
+ # #3453 review: read the parent's LIVE `test_state` too, not
2789
+ # just the legs'. *board* is a snapshot; between it being
2790
+ # loaded and this sweep running, the parent may already have
2791
+ # been resolved out of band (a human's `coord test` override,
2792
+ # or a `finalize_smoke_fanout` fold from another process).
2793
+ # `finalize_smoke_fanout` is documented to NO-OP against an
2794
+ # already-terminal parent precisely to protect that override —
2795
+ # so without this pre-read, the post-call re-read below would
2796
+ # see that pre-existing verdict, conclude "terminal, therefore
2797
+ # I finalized it", and post an "auto-healed ... finalized the
2798
+ # fan-out aggregate verdict (X)" comment for a verdict this
2799
+ # sweep did not produce. The value itself is never clobbered
2800
+ # (the no-op protects it), so this is misattribution rather
2801
+ # than corruption — but a gate that cannot tell its own write
2802
+ # from someone else's is not a gate (#2096).
2803
+ parent_live = load_assignment_test_state(w.assignment_id)
2804
+ leg_states = [
2805
+ load_assignment_test_state(leg_id) for leg_id, _caps, _cmd in manifest_legs
2806
+ ]
2807
+ except Exception as exc: # noqa: BLE001 — never sink the sweep
2808
+ log.warning(
2809
+ "sweep_stuck_test_state_rows: could not read the fan-out "
2810
+ "leg/parent verdicts for %s (%s) — leaving it for the "
2811
+ "next tick",
2812
+ w.assignment_id, exc,
2813
+ )
2814
+ continue
2815
+
2816
+ if parent_live not in (None, "running"):
2817
+ # Already resolved out of band — nothing wedged any more.
2818
+ # Not a heal (this sweep did nothing), so no write, no tally
2819
+ # and no comment, in dry-run and live alike.
2820
+ continue
2821
+
2822
+ ready = bool(manifest_legs) and all(
2823
+ s not in (None, "running") for s in leg_states
2824
+ )
2825
+ if not ready:
2826
+ # A sibling leg hasn't reported in yet — nothing to fold.
2827
+ # No write, no tally; try again next tick once it lands.
2828
+ continue
2829
+
2830
+ if dry_run:
2831
+ healed.append(StuckTestStateHeal(
2832
+ assignment_id=w.assignment_id,
2833
+ machine_name=w.machine_name or "unknown",
2834
+ repo_name=w.repo_name,
2835
+ issue_number=w.issue_number,
2836
+ detail=detail,
2837
+ action=(
2838
+ "(dry-run) would defer to finalize_smoke_fanout to "
2839
+ "fold every leg's own verdict into the parent's "
2840
+ "aggregate (#3453)"
2841
+ ),
2842
+ ))
2843
+ continue
2844
+
2845
+ from coord.smoke import finalize_smoke_fanout # noqa: PLC0415
2846
+
2847
+ # `finalize_smoke_fanout` never raises (documented, catches and
2848
+ # logs internally) — no try/except needed around the call
2849
+ # itself, unlike `record_test_verdict` below.
2850
+ finalize_smoke_fanout(w.assignment_id)
2851
+
2852
+ # #2096: same confirm-by-re-read discipline as the single-leg
2853
+ # path — a lost write here is exactly the #2802 class this
2854
+ # whole sweep exists to catch, so report a heal only once the
2855
+ # aggregate is actually observable as terminal on the parent.
2856
+ try:
2857
+ observed = load_assignment_test_state(w.assignment_id)
2858
+ except Exception as exc: # noqa: BLE001 — never sink the sweep
2859
+ log.warning(
2860
+ "sweep_stuck_test_state_rows: could not confirm the "
2861
+ "finalized fan-out verdict for %s (%s) — not reporting "
2862
+ "a heal",
2863
+ w.assignment_id, exc,
2864
+ )
2865
+ continue
2866
+ if observed in (None, "running"):
2867
+ # `finalize_smoke_fanout` no-op'd — e.g. a sibling leg's own
2868
+ # verdict changed between our readiness peek above and the
2869
+ # call (or the manifest was consumed/rewritten concurrently).
2870
+ # Not healed yet; the next tick will re-check readiness.
2871
+ continue
2872
+
2873
+ # #3453 review: `finalize_smoke_fanout` writes its own
2874
+ # `test_reason` (manifest line + headline + per-leg summary) and
2875
+ # knows nothing about this sweep's re-heal marker, so stamp it on
2876
+ # afterwards — otherwise this branch alone lacks the guard the
2877
+ # other three classifications now share, and a parent re-stamped
2878
+ # to `running` without a fresh leg would re-enter here and
2879
+ # re-report a duplicate heal (hence a duplicate "auto-healed"
2880
+ # GitHub comment) every tick, the quadraui#1077 shape.
2881
+ _stamp_fanout_heal_marker(w.assignment_id, observed, smoke.assignment_id)
2882
+
2883
+ healed.append(StuckTestStateHeal(
2884
+ assignment_id=w.assignment_id,
2885
+ machine_name=w.machine_name or "unknown",
2886
+ repo_name=w.repo_name,
2887
+ issue_number=w.issue_number,
2888
+ detail=detail,
2889
+ action=(
2890
+ f"finalized the fan-out aggregate verdict "
2891
+ f"({observed!r}) for the parent from every leg's own "
2892
+ "recorded verdict (#3453)"
2893
+ ),
2894
+ ))
2895
+ continue
2896
+
2897
+ if recorded_verdict is not None:
2898
+ # #3453: propagate the child's own already-recorded verdict —
2899
+ # never `propagate_smoke_terminal_failure` (that always
2900
+ # classifies environmental-vs-work and, for the environmental
2901
+ # branch, always spends a #3315 tally; neither applies here,
2902
+ # since nothing died and this is not a fresh Test-stage death).
2903
+ if dry_run:
2904
+ healed.append(StuckTestStateHeal(
2905
+ assignment_id=w.assignment_id,
2906
+ machine_name=w.machine_name or "unknown",
2907
+ repo_name=w.repo_name,
2908
+ issue_number=w.issue_number,
2909
+ detail=detail,
2910
+ action=(
2911
+ "(dry-run) would propagate the Test-stage child's "
2912
+ "recorded verdict to the parent (#3453)"
2913
+ ),
2914
+ ))
2915
+ continue
2916
+
2917
+ from coord.state import ( # noqa: PLC0415
2918
+ load_assignment_test_state,
2919
+ record_test_verdict,
2920
+ )
2921
+
2922
+ propagated_reason = (
2923
+ f"{cause}. {_stuck_test_state_heal_marker(smoke.assignment_id)}"
2924
+ )
2925
+ try:
2926
+ record_test_verdict(
2927
+ assignment_id=w.assignment_id,
2928
+ test_state=recorded_verdict,
2929
+ test_reason=propagated_reason,
2930
+ )
2931
+ except Exception as exc: # noqa: BLE001 — never sink the sweep
2932
+ log.warning(
2933
+ "sweep_stuck_test_state_rows: recovery write failed for "
2934
+ "%s (%s) — leaving test_state='running' for the next "
2935
+ "tick",
2936
+ w.assignment_id, exc,
2937
+ )
2938
+ continue
2939
+
2940
+ # #2096: a returning `record_test_verdict` proves the write was
2941
+ # ISSUED, not that it LANDED — and the whole reason this row is
2942
+ # here is that a Test verdict write silently vanished once
2943
+ # already (#2802: DB-lock contention, a daemon that accepted the
2944
+ # POST and died before committing, a degraded remote write that
2945
+ # fell back to a local DB nothing else reads). Re-read the parent
2946
+ # row and only report a heal when the propagated verdict is
2947
+ # actually observable on it. `load_assignment_test_state` is the
2948
+ # same single-row reader `coord notify`'s smoke reap uses to ask
2949
+ # this exact question (#2244) — one question, one answer — and it
2950
+ # returns `None` for "absent row / NULL / degraded read", all of
2951
+ # which mean "I cannot see the verdict", so this confirmation
2952
+ # fails CLOSED: no `StuckTestStateHeal`, hence no "auto-healed"
2953
+ # GitHub comment claiming a propagation nobody can observe. The
2954
+ # repair itself still stands if it did land, and the #3453 marker
2955
+ # in `test_reason` still suppresses a duplicate attempt next tick.
2956
+ #
2957
+ # The environmental branch below deliberately has no equivalent
2958
+ # check: its recovery writes `test_state=NULL`, which this reader
2959
+ # cannot distinguish from "row absent" or "read failed", so a
2960
+ # re-read there could only produce a verdict that is always
2961
+ # ambiguous — never a gate that can genuinely fail.
2962
+ try:
2963
+ observed = load_assignment_test_state(w.assignment_id)
2964
+ except Exception as exc: # noqa: BLE001 — never sink the sweep
2965
+ log.warning(
2966
+ "sweep_stuck_test_state_rows: could not confirm the "
2967
+ "propagated verdict for %s (%s) — not reporting a heal",
2968
+ w.assignment_id, exc,
2969
+ )
2970
+ continue
2971
+ if observed != recorded_verdict:
2972
+ log.warning(
2973
+ "sweep_stuck_test_state_rows: propagated "
2974
+ "test_state=%r to %s but a re-read shows %r — the write "
2975
+ "did not land; not reporting a heal",
2976
+ recorded_verdict, w.assignment_id, observed,
2977
+ )
2978
+ continue
2979
+
2980
+ healed.append(StuckTestStateHeal(
2981
+ assignment_id=w.assignment_id,
2982
+ machine_name=w.machine_name or "unknown",
2983
+ repo_name=w.repo_name,
2984
+ issue_number=w.issue_number,
2985
+ detail=detail,
2986
+ action=(
2987
+ "propagated the Test-stage child's recorded verdict to "
2988
+ "the parent (#3453)"
2989
+ ),
2990
+ ))
2991
+ continue
2992
+
2497
2993
  if dry_run:
2498
2994
  healed.append(StuckTestStateHeal(
2499
2995
  assignment_id=w.assignment_id,