code-coordinator 0.5.530__tar.gz → 0.5.532__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 (913) hide show
  1. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/PKG-INFO +5 -1
  2. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/code_coordinator.egg-info/PKG-INFO +5 -1
  3. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/code_coordinator.egg-info/requires.txt +5 -0
  4. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/code_coordinator.egg-info/scm_version.json +2 -2
  5. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/audit.py +73 -3
  6. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/lifecycle.py +58 -15
  7. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/report.py +45 -24
  8. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/config.py +82 -7
  9. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dashboard/server.py +65 -16
  10. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/forge_availability.py +162 -75
  11. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/housekeeping.py +56 -7
  12. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/reports.py +375 -4
  13. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/serve_app.py +83 -17
  14. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/sql.py +76 -0
  15. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/pyproject.toml +14 -1
  16. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_audit_log.py +95 -0
  17. code_coordinator-0.5.532/tests/test_config_audit.py +157 -0
  18. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dashboard.py +3 -1
  19. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dashboard_fixture.py +3 -1
  20. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_forge_availability.py +175 -1
  21. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_github_ops.py +10 -0
  22. code_coordinator-0.5.532/tests/test_housekeeping.py +539 -0
  23. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reports.py +402 -3
  24. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_sql_dialect.py +84 -0
  25. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_sqlite_connect_ratchet.py +8 -2
  26. code_coordinator-0.5.530/tests/test_config_audit.py +0 -86
  27. code_coordinator-0.5.530/tests/test_housekeeping.py +0 -259
  28. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.claude/commands/board.md +0 -0
  29. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.claude/commands/complete-session.md +0 -0
  30. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.claude/commands/coordinator.md +0 -0
  31. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.githooks/_lib.sh +0 -0
  32. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.githooks/post-checkout +0 -0
  33. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.githooks/post-commit +0 -0
  34. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.githooks/post-merge +0 -0
  35. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  36. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.github/coord-ci-acceptance.yml +0 -0
  37. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.github/workflows/auto-release.yml +0 -0
  38. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.github/workflows/publish.yml +0 -0
  39. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.github/workflows/test.yml +0 -0
  40. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/.gitignore +0 -0
  41. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/CLAUDE.md +0 -0
  42. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/GOAL.md +0 -0
  43. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/LICENSE +0 -0
  44. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/MANIFEST.in +0 -0
  45. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/README.md +0 -0
  46. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/code_coordinator.egg-info/SOURCES.txt +0 -0
  47. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/code_coordinator.egg-info/dependency_links.txt +0 -0
  48. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/code_coordinator.egg-info/entry_points.txt +0 -0
  49. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/code_coordinator.egg-info/scm_file_list.json +0 -0
  50. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/code_coordinator.egg-info/top_level.txt +0 -0
  51. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/__init__.py +0 -0
  52. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/_board_mapping.py +0 -0
  53. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/acceptance.py +0 -0
  54. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/acceptance_drivers.py +0 -0
  55. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/agent.py +0 -0
  56. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/agent_app.py +0 -0
  57. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/agent_update.py +0 -0
  58. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/agents/opencode/.gitignore +0 -0
  59. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/agents/opencode/agents/work.md +0 -0
  60. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/agents/opencode/routing.jsonc +0 -0
  61. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/approved_work.py +0 -0
  62. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/auto_loop.py +0 -0
  63. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/backup.py +0 -0
  64. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/block_log.py +0 -0
  65. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/board_schema.py +0 -0
  66. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/board_service.py +0 -0
  67. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/board_wire.py +0 -0
  68. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/brain.py +0 -0
  69. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/branch_model.py +0 -0
  70. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/bug_intake.py +0 -0
  71. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/cargo_cache.py +0 -0
  72. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/ci_fix.py +0 -0
  73. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/ci_github.py +0 -0
  74. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/ci_gitlab.py +0 -0
  75. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/ci_store.py +0 -0
  76. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/claim.py +0 -0
  77. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/claude_setup_token.py +0 -0
  78. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/cli.py +0 -0
  79. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/client.py +0 -0
  80. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/codegen.py +0 -0
  81. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/__init__.py +0 -0
  82. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/_common.py +0 -0
  83. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/acceptance.py +0 -0
  84. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/agent_ops.py +0 -0
  85. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/audit.py +0 -0
  86. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/backup.py +0 -0
  87. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/chat.py +0 -0
  88. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/ci.py +0 -0
  89. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/codegen.py +0 -0
  90. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/dispatch.py +0 -0
  91. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/dispatch_workers.py +0 -0
  92. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/dr.py +0 -0
  93. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/drive.py +0 -0
  94. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/drive_queue.py +0 -0
  95. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/gate_a.py +0 -0
  96. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/gates.py +0 -0
  97. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/issues.py +0 -0
  98. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/machine.py +0 -0
  99. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/merge.py +0 -0
  100. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/milestone.py +0 -0
  101. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/plan_followup.py +0 -0
  102. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/plans.py +0 -0
  103. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/portal.py +0 -0
  104. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/pr.py +0 -0
  105. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/release.py +0 -0
  106. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/repo.py +0 -0
  107. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/review.py +0 -0
  108. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/scorecard.py +0 -0
  109. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/sessions.py +0 -0
  110. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/setup.py +0 -0
  111. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/status.py +0 -0
  112. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/store_migrate.py +0 -0
  113. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/terminal.py +0 -0
  114. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/test_gate.py +0 -0
  115. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/commands/tui.py +0 -0
  116. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/comments.py +0 -0
  117. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/config_reload.py +0 -0
  118. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/confirm_test.py +0 -0
  119. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/conflict_fix.py +0 -0
  120. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dao.py +0 -0
  121. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dashboard/__init__.py +0 -0
  122. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dashboard/fixture.py +0 -0
  123. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dashboard/index.html +0 -0
  124. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dashboard/terminal.py +0 -0
  125. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/db.py +0 -0
  126. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dead_end.py +0 -0
  127. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/decomposition_chat.py +0 -0
  128. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/README.md +0 -0
  129. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-agent.service +0 -0
  130. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-backup.service +0 -0
  131. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-backup.timer +0 -0
  132. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-db-backup.service +0 -0
  133. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-db-backup.sh +0 -0
  134. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-db-backup.timer +0 -0
  135. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-dr-verify.service +0 -0
  136. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-dr-verify.timer +0 -0
  137. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-drive-queue.service +0 -0
  138. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-drive-queue.timer +0 -0
  139. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-failure-notify.service +0 -0
  140. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-fleet-watchdog.service +0 -0
  141. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  142. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-notify.service +0 -0
  143. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-notify.timer +0 -0
  144. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-release-propagate.service +0 -0
  145. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-release-propagate.timer +0 -0
  146. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-release-window.service +0 -0
  147. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-release-window.timer +0 -0
  148. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-serve.service +0 -0
  149. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-web-dist-build.service +0 -0
  150. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-web-dist-build.timer +0 -0
  151. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy/coord-web.service +0 -0
  152. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy_manifest.py +0 -0
  153. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deploy_units.py +0 -0
  154. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deprecation_telemetry.py +0 -0
  155. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/deps.py +0 -0
  156. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/diagnose.py +0 -0
  157. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dispatch.py +0 -0
  158. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dispatch_liveness.py +0 -0
  159. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dist_name.py +0 -0
  160. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dr_promote.py +0 -0
  161. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/dr_verify.py +0 -0
  162. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/drive.py +0 -0
  163. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/drive_queue.py +0 -0
  164. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/drive_sessions_snapshot.py +0 -0
  165. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/drive_state.py +0 -0
  166. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/events.py +0 -0
  167. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/failure_class.py +0 -0
  168. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/failure_classifier.py +0 -0
  169. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/filelock.py +0 -0
  170. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/fleet_config_health.py +0 -0
  171. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/freshness.py +0 -0
  172. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/gate_a.py +0 -0
  173. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/gate_b.py +0 -0
  174. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/gate_snapshot.py +0 -0
  175. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/gates.py +0 -0
  176. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/gen_board_fixture.py +0 -0
  177. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/github_ops.py +0 -0
  178. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/github_throttle.py +0 -0
  179. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/goal.py +0 -0
  180. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/graph_health.py +0 -0
  181. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/__init__.py +0 -0
  182. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/aggregate.py +0 -0
  183. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/__init__.py +0 -0
  184. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/_ci_pin.py +0 -0
  185. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/agent_install.py +0 -0
  186. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/cargo_targets.py +0 -0
  187. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/claude_binary.py +0 -0
  188. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/config_drift.py +0 -0
  189. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  190. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/coord_web_ci_pin.py +0 -0
  191. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/deploy_lane_facts.py +0 -0
  192. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/disk.py +0 -0
  193. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/fleet_board.py +0 -0
  194. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  195. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/fleet_phantom.py +0 -0
  196. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/fleet_unit_drift.py +0 -0
  197. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/graph.py +0 -0
  198. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/graphify_cli.py +0 -0
  199. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/index_lock.py +0 -0
  200. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/issues_sync_staleness.py +0 -0
  201. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/local_machine_identity.py +0 -0
  202. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/plan_usage.py +0 -0
  203. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/pr_churn.py +0 -0
  204. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/release_cordon.py +0 -0
  205. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/repo_state.py +0 -0
  206. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/spawned_coord.py +0 -0
  207. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/stalled_pipeline.py +0 -0
  208. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/timer_active.py +0 -0
  209. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/toolchain.py +0 -0
  210. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/unit_drift.py +0 -0
  211. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/unit_enablement.py +0 -0
  212. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/wedged_drive_queue.py +0 -0
  213. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/checks/worktrees.py +0 -0
  214. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/cli.py +0 -0
  215. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/context.py +0 -0
  216. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/fleet_snapshot.py +0 -0
  217. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/models.py +0 -0
  218. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/pypi.py +0 -0
  219. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/registry.py +0 -0
  220. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/render.py +0 -0
  221. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/health/units.py +0 -0
  222. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/hooks.py +0 -0
  223. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/interactive.py +0 -0
  224. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/invariant_alarms.py +0 -0
  225. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/issue_store.py +0 -0
  226. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/issues_sync_status.py +0 -0
  227. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/liveness_auditor.py +0 -0
  228. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/machine_fault.py +0 -0
  229. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/machine_metrics.py +0 -0
  230. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/machine_onboard.py +0 -0
  231. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/machine_pause.py +0 -0
  232. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/machine_stats.py +0 -0
  233. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/merge_queue.py +0 -0
  234. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/milestone_chat.py +0 -0
  235. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/milestone_dispatch.py +0 -0
  236. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/milestone_gate.py +0 -0
  237. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/milestone_order.py +0 -0
  238. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/mock_author.py +0 -0
  239. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/models.py +0 -0
  240. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/network.py +0 -0
  241. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/new_issue_chat.py +0 -0
  242. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notifier/__init__.py +0 -0
  243. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notifier/baseline.py +0 -0
  244. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notifier/cli.py +0 -0
  245. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notifier/collect.py +0 -0
  246. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notifier/digest.py +0 -0
  247. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notifier/models.py +0 -0
  248. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notifier/predicate.py +0 -0
  249. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notifier/service.py +0 -0
  250. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notifier/store.py +0 -0
  251. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notifier/transport.py +0 -0
  252. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/notify.py +0 -0
  253. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/openapi.py +0 -0
  254. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/overlap_fence.py +0 -0
  255. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/overlap_predict.py +0 -0
  256. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/parentage.py +0 -0
  257. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/parentage_github.py +0 -0
  258. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/pipeline.py +0 -0
  259. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/plan_parser.py +0 -0
  260. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/plans.py +0 -0
  261. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/platform_paths.py +0 -0
  262. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/portal_bridge.py +0 -0
  263. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/portal_store.py +0 -0
  264. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/portal_sync.py +0 -0
  265. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/pr_body_lint.py +0 -0
  266. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/prereqs.py +0 -0
  267. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/progress.py +0 -0
  268. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/providers/__init__.py +0 -0
  269. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/providers/base.py +0 -0
  270. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/providers/claude.py +0 -0
  271. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/providers/claude_pty.py +0 -0
  272. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/providers/opencode.py +0 -0
  273. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/queue_diagnose.py +0 -0
  274. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/reconcile.py +0 -0
  275. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/reconcile_tick.py +0 -0
  276. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/refine_chat.py +0 -0
  277. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/release_cordon.py +0 -0
  278. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/release_propagate.py +0 -0
  279. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/release_verify.py +0 -0
  280. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/release_window.py +0 -0
  281. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/repo_dormancy.py +0 -0
  282. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/repo_edit.py +0 -0
  283. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/repo_onboard.py +0 -0
  284. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/rest_schema.py +0 -0
  285. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/restart_cmd.py +0 -0
  286. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/revalidate.py +0 -0
  287. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/review.py +0 -0
  288. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/scorecard.py +0 -0
  289. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/self_health.py +0 -0
  290. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  291. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  292. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  293. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  294. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  295. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/skills/portal-followup/SKILL.md +0 -0
  296. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/skills/release-now/SKILL.md +0 -0
  297. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  298. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  299. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/skills/update-issue/SKILL.md +0 -0
  300. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/smoke.py +0 -0
  301. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/spend_ceiling.py +0 -0
  302. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/split_work.py +0 -0
  303. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/stage_projection.py +0 -0
  304. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/state.py +0 -0
  305. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/store_migrate.py +0 -0
  306. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/store_parity.py +0 -0
  307. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/templates/deploy-cloudflare.node.yml +0 -0
  308. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/test_author.py +0 -0
  309. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/test_chat.py +0 -0
  310. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/test_orchestrator.py +0 -0
  311. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/test_report.py +0 -0
  312. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/tui_release.py +0 -0
  313. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/uat_checks.py +0 -0
  314. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/usage.py +0 -0
  315. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/usage_limits.py +0 -0
  316. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/usage_rollup.py +0 -0
  317. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coord/worker_events.py +0 -0
  318. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/coordinator.example.yml +0 -0
  319. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-agent.service +0 -0
  320. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-backup.service +0 -0
  321. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-backup.timer +0 -0
  322. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-db-backup.service +0 -0
  323. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-db-backup.sh +0 -0
  324. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-db-backup.timer +0 -0
  325. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-dr-verify.service +0 -0
  326. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-dr-verify.timer +0 -0
  327. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-drive-queue.service +0 -0
  328. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-drive-queue.timer +0 -0
  329. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-failure-notify.service +0 -0
  330. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-failure-notify.sh +0 -0
  331. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-fleet-watchdog.service +0 -0
  332. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-fleet-watchdog.timer +0 -0
  333. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-notify.service +0 -0
  334. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-notify.timer +0 -0
  335. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-release-propagate.service +0 -0
  336. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-release-propagate.timer +0 -0
  337. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-release-window.service +0 -0
  338. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-release-window.timer +0 -0
  339. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-serve.service +0 -0
  340. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-web-dist-build.service +0 -0
  341. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-web-dist-build.sh +0 -0
  342. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-web-dist-build.timer +0 -0
  343. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-web-rollback.sh +0 -0
  344. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/coord-web.service +0 -0
  345. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/deploy/node-shim.sh +0 -0
  346. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/ADR_COORD_TUI_CI.md +0 -0
  347. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  348. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/ADR_COORD_WEB_CI.md +0 -0
  349. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/ADR_COORD_WEB_DIST.md +0 -0
  350. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  351. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/AGENT_OPERATIONS.md +0 -0
  352. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/ARCHITECTURE.md +0 -0
  353. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/ARCH_SECURITY_GATES.md +0 -0
  354. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/COCKPIT.md +0 -0
  355. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/CONTROL_CENTER.md +0 -0
  356. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/COST_DISCIPLINE.md +0 -0
  357. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/CROSS_PLATFORM.md +0 -0
  358. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/CUSTOMER_FACING_APPS.md +0 -0
  359. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/CUSTOMER_PORTAL.md +0 -0
  360. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/DATA_STORE_SELECTION.md +0 -0
  361. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/DISASTER_RECOVERY.md +0 -0
  362. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/DRIVE_QUEUE.md +0 -0
  363. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/EPHEMERAL_WORKERS.md +0 -0
  364. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/FORGE_MIGRATION.md +0 -0
  365. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/GRAPHIFY_SETUP.md +0 -0
  366. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/ISSUE_GUIDANCE.md +0 -0
  367. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/MAC_MINI.md +0 -0
  368. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  369. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/NOTIFIER.md +0 -0
  370. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/OPENCODE_VERIFICATION.md +0 -0
  371. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/OPERATING_GOTCHAS.md +0 -0
  372. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/OPERATOR_GUIDES.md +0 -0
  373. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/ORACLE_LOOP.md +0 -0
  374. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/PHONE_WEBAPP.md +0 -0
  375. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/PIPELINE_V2.md +0 -0
  376. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/PLATFORM_EVOLUTION.md +0 -0
  377. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/SECOND_BACKEND.md +0 -0
  378. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/STORE_SERVICE.md +0 -0
  379. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  380. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/WEB_CONTROL_CENTER.md +0 -0
  381. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/WSL_WINDOWS_WORKER.md +0 -0
  382. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/mocks/web/README.md +0 -0
  383. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/mocks/web/_tokens.css +0 -0
  384. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/mocks/web/issue-detail.html +0 -0
  385. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/mocks/web/pipeline-narrow.html +0 -0
  386. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/docs/mocks/web/pipeline-wide.html +0 -0
  387. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/graphify-out/.gitignore +0 -0
  388. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/install-agent.sh +0 -0
  389. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/audit_review_verdict_overrides.py +0 -0
  390. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  391. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/build-worker-image.sh +0 -0
  392. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/coordinator-machine.py +0 -0
  393. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/dr-down.sh +0 -0
  394. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/dr-up.sh +0 -0
  395. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/epic-down.sh +0 -0
  396. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/epic-up.sh +0 -0
  397. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/preflight.sh +0 -0
  398. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/provision-server.sh +0 -0
  399. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/provision-worker.sh +0 -0
  400. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  401. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  402. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/throwaway-vm.sh +0 -0
  403. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/azure-workers/verify-github-token.sh +0 -0
  404. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/check_gh_argv_containment.py +0 -0
  405. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/codegen.py +0 -0
  406. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/coord-test-runner.sh +0 -0
  407. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  408. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  409. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  410. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  411. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/coord-venv-rollback.sh +0 -0
  412. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/drive-batch.sh +0 -0
  413. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/extract-coord-tui.sh +0 -0
  414. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/fleet_watchdog.py +0 -0
  415. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/gen_board_fixture.py +0 -0
  416. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/gen_mock_index.py +0 -0
  417. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/lib/provision-core.sh +0 -0
  418. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/next_release_tag.py +0 -0
  419. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/provision-machine.sh +0 -0
  420. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/run_tests_in_populated_home.sh +0 -0
  421. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/run_tests_without_gh.sh +0 -0
  422. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/setup-macmini.sh +0 -0
  423. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/smoke_437_interactive.py +0 -0
  424. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/verify-provision-noble.sh +0 -0
  425. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/verify_878_review_capture.py +0 -0
  426. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/verify_release_published.py +0 -0
  427. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/scripts/verify_release_wheel.py +0 -0
  428. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/setup.cfg +0 -0
  429. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/SMOKE_SET.md +0 -0
  430. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/__init__.py +0 -0
  431. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-37/conftest.py +0 -0
  432. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-37/contract.md +0 -0
  433. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-37/manifest.yml +0 -0
  434. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  435. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  436. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-51/contract.md +0 -0
  437. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  438. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  439. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-51/manifest.yml +0 -0
  440. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  441. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-51/tsconfig.json +0 -0
  442. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  443. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/backends.py +0 -0
  444. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/conftest.py +0 -0
  445. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/board-pipeline-basic.json +0 -0
  446. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  447. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  448. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  449. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  450. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/playwright/all_pass.json +0 -0
  451. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  452. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/playwright/mixed_fail.json +0 -0
  453. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  454. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  455. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/playwright/skip.json +0 -0
  456. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/playwright/truncated.json +0 -0
  457. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  458. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  459. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  460. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  461. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  462. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  463. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  464. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  465. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  466. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_acceptance.py +0 -0
  467. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_acceptance_drivers.py +0 -0
  468. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent.py +0 -0
  469. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_api_error.py +0 -0
  470. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_app.py +0 -0
  471. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_branch_base.py +0 -0
  472. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_branch_capture.py +0 -0
  473. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_config_free_1712.py +0 -0
  474. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_deploy_units_endpoint.py +0 -0
  475. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_dirty_worktree.py +0 -0
  476. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  477. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_graph_self_heal.py +0 -0
  478. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_health_h3.py +0 -0
  479. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_idle_restart.py +0 -0
  480. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_push_failure.py +0 -0
  481. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_reap.py +0 -0
  482. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_repos_and_pull.py +0 -0
  483. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_restart_services_endpoint.py +0 -0
  484. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_skills_self_heal.py +0 -0
  485. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_startup_diagnostics.py +0 -0
  486. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_update.py +0 -0
  487. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_update_bluegreen.py +0 -0
  488. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_usage_limit.py +0 -0
  489. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_agent_zero_commit.py +0 -0
  490. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_ambient_home_isolation.py +0 -0
  491. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_approve_capability_reroute_3241.py +0 -0
  492. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_approve_dependency_busy_2804.py +0 -0
  493. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_approve_reject_plan.py +0 -0
  494. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_approve_usage_gate.py +0 -0
  495. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_approved_work_2532.py +0 -0
  496. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_approved_work_2996.py +0 -0
  497. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_assignment_already_recorded_daemon.py +0 -0
  498. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_audit_outcome.py +0 -0
  499. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_audit_query.py +0 -0
  500. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_auto_loop.py +0 -0
  501. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_auto_release_publish_2035.py +0 -0
  502. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_backend_selection.py +0 -0
  503. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_backup.py +0 -0
  504. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_base_checkout_restore.py +0 -0
  505. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_block_log.py +0 -0
  506. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_board_cap_762.py +0 -0
  507. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_board_fixture.py +0 -0
  508. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_board_read_path.py +0 -0
  509. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_board_schema.py +0 -0
  510. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_board_service.py +0 -0
  511. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_board_state.py +0 -0
  512. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_board_wire.py +0 -0
  513. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_brain.py +0 -0
  514. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_branch_model.py +0 -0
  515. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_bug_intake.py +0 -0
  516. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_build_worker_image_env_update.py +0 -0
  517. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cargo_cache.py +0 -0
  518. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_check_gh_argv_containment.py +0 -0
  519. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_ci_acceptance_gate_1950.py +0 -0
  520. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_ci_fix.py +0 -0
  521. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_ci_github.py +0 -0
  522. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_ci_gitlab.py +0 -0
  523. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_ci_parity_2091.py +0 -0
  524. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_ci_store.py +0 -0
  525. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_claim.py +0 -0
  526. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_claude_md_budget.py +0 -0
  527. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_claude_setup_token.py +0 -0
  528. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_acceptance.py +0 -0
  529. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_assign.py +0 -0
  530. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  531. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_assign_interactive_remote.py +0 -0
  532. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_assign_provider.py +0 -0
  533. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  534. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_audit.py +0 -0
  535. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_chat_continue.py +0 -0
  536. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_ci.py +0 -0
  537. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_codegen.py +0 -0
  538. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_decide.py +0 -0
  539. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_diagnose_capability_rules.py +0 -0
  540. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_diagnose_config_provenance.py +0 -0
  541. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_diagnose_forge_availability.py +0 -0
  542. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_diagnose_graph.py +0 -0
  543. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_diagnose_self.py +0 -0
  544. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_diagnose_test_coverage.py +0 -0
  545. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_doctor.py +0 -0
  546. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_doctor_config_free_1801.py +0 -0
  547. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  548. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  549. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_drive.py +0 -0
  550. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_drive_queue.py +0 -0
  551. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_escalate.py +0 -0
  552. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_fix_headless_review.py +0 -0
  553. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_gate_a.py +0 -0
  554. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_install_drift.py +0 -0
  555. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_install_skills.py +0 -0
  556. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_issue_comment.py +0 -0
  557. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_issue_create_label.py +0 -0
  558. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_issue_reopen.py +0 -0
  559. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_issue_view_list.py +0 -0
  560. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_issues.py +0 -0
  561. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_merge.py +0 -0
  562. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_milestone_assign.py +0 -0
  563. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_milestone_capture.py +0 -0
  564. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_milestone_chat_add_child.py +0 -0
  565. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_milestone_dispatch.py +0 -0
  566. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_milestone_gate_b.py +0 -0
  567. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_milestone_gate_c.py +0 -0
  568. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_milestone_order.py +0 -0
  569. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  570. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_milestone_ship.py +0 -0
  571. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_network.py +0 -0
  572. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_new_issue_chat.py +0 -0
  573. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_plans.py +0 -0
  574. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_portal.py +0 -0
  575. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_pr.py +0 -0
  576. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_pull_artifact.py +0 -0
  577. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_queue.py +0 -0
  578. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_reattach_sessions.py +0 -0
  579. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_refine_board.py +0 -0
  580. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_release_preflight.py +0 -0
  581. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_release_propagate.py +0 -0
  582. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_release_window.py +0 -0
  583. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_repo_2220.py +0 -0
  584. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  585. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_scorecard.py +0 -0
  586. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_serve_store_backend_3084.py +0 -0
  587. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_set_review_findings.py +0 -0
  588. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_advisory_terminal.py +0 -0
  589. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_contested_tag.py +0 -0
  590. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_invariant_alarms.py +0 -0
  591. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_machine_fault.py +0 -0
  592. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_merge_queue.py +0 -0
  593. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_provider.py +0 -0
  594. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_retried_3340.py +0 -0
  595. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_review_finalizing.py +0 -0
  596. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_supervisor_3366.py +0 -0
  597. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_test_failed_tag.py +0 -0
  598. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_status_usage_limit.py +0 -0
  599. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_sync_comments_873.py +0 -0
  600. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_test_plan.py +0 -0
  601. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_track.py +0 -0
  602. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_tui_update.py +0 -0
  603. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cli_wait.py +0 -0
  604. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_client.py +0 -0
  605. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_client_base_install.py +0 -0
  606. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_client_config_cache_atomic_3052.py +0 -0
  607. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_client_resource_migration_1946.py +0 -0
  608. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_commands_common.py +0 -0
  609. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_comments.py +0 -0
  610. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_completion_summary.py +0 -0
  611. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_config.py +0 -0
  612. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_config_acceptance.py +0 -0
  613. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_config_drift_check.py +0 -0
  614. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_config_effective.py +0 -0
  615. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_config_pricing.py +0 -0
  616. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  617. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_config_usage_gate.py +0 -0
  618. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_confirm_test.py +0 -0
  619. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_conflict_fix.py +0 -0
  620. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_conflict_fix_semantic.py +0 -0
  621. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  622. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_coord_test.py +0 -0
  623. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  624. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_coord_test_runner_baseline.py +0 -0
  625. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_coord_test_runner_populated_home.py +0 -0
  626. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_coord_test_runner_routing.py +0 -0
  627. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_coord_test_runner_toolchain.py +0 -0
  628. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_coord_uat.py +0 -0
  629. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_coord_web_sse_restart_live.py +0 -0
  630. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_coordinator_machine.py +0 -0
  631. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_cross_platform_imports.py +0 -0
  632. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dao.py +0 -0
  633. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dashboard_api.py +0 -0
  634. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dashboard_server.py +0 -0
  635. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dashboard_terminal.py +0 -0
  636. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dashboard_terminal_live.py +0 -0
  637. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_db.py +0 -0
  638. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dead_end.py +0 -0
  639. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_decomposition_chat.py +0 -0
  640. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deploy_coord_db_backup.py +0 -0
  641. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deploy_coord_web_dist.py +0 -0
  642. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deploy_coord_web_rollback.py +0 -0
  643. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deploy_db_backup_unit.py +0 -0
  644. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deploy_drive_queue_unit.py +0 -0
  645. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deploy_failure_notify_unit.py +0 -0
  646. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deploy_manifest.py +0 -0
  647. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deploy_notify_unit.py +0 -0
  648. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deploy_units_lane.py +0 -0
  649. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deploy_web_unit.py +0 -0
  650. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deprecation_telemetry.py +0 -0
  651. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_deps.py +0 -0
  652. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_diagnose.py +0 -0
  653. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dispatch.py +0 -0
  654. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dispatch_liveness.py +0 -0
  655. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dispatch_target_validation.py +0 -0
  656. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dispatch_workers.py +0 -0
  657. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dist_name.py +0 -0
  658. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_done_housekeeping.py +0 -0
  659. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dr_azure_scripts.py +0 -0
  660. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dr_promote.py +0 -0
  661. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_dr_verify.py +0 -0
  662. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive.py +0 -0
  663. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_machine_fault.py +0 -0
  664. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_queue.py +0 -0
  665. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_queue_blocked_rendering.py +0 -0
  666. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_queue_launch_argv.py +0 -0
  667. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_queue_max_parallel_config.py +0 -0
  668. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  669. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_queue_roll_pending.py +0 -0
  670. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  671. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_sessions_snapshot.py +0 -0
  672. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_state.py +0 -0
  673. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_drive_tmux.py +0 -0
  674. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_epic_up_capability_detection.py +0 -0
  675. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  676. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_epic_up_image_provenance.py +0 -0
  677. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_errors.py +0 -0
  678. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_events.py +0 -0
  679. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_failure_class.py +0 -0
  680. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_failure_classifier.py +0 -0
  681. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_filelock.py +0 -0
  682. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  683. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_fix_escalation_classifier.py +0 -0
  684. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_fix_of_force_override.py +0 -0
  685. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_fleet_config_health.py +0 -0
  686. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_fleet_health_probes.py +0 -0
  687. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_fleet_health_snapshot.py +0 -0
  688. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_fleet_watchdog.py +0 -0
  689. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_freshness.py +0 -0
  690. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_gate_a.py +0 -0
  691. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_gate_b.py +0 -0
  692. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_gate_snapshot_staleness.py +0 -0
  693. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_gates.py +0 -0
  694. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  695. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_gen_mock_index.py +0 -0
  696. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_generated_rust_fixture.py +0 -0
  697. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_generated_rust_requests.py +0 -0
  698. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_generated_types_fixture.py +0 -0
  699. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_github_throttle.py +0 -0
  700. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_goal.py +0 -0
  701. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_graph_health.py +0 -0
  702. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_graph_selfheal_absent_2237.py +0 -0
  703. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_handoff.py +0 -0
  704. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_checks.py +0 -0
  705. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_cli.py +0 -0
  706. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_cli_graph.py +0 -0
  707. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_config.py +0 -0
  708. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_context.py +0 -0
  709. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_coord_tui_ci_pin.py +0 -0
  710. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_coord_web_ci_pin.py +0 -0
  711. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_deploy_lane_facts.py +0 -0
  712. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_fix.py +0 -0
  713. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_incident_regression.py +0 -0
  714. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_issues_sync_staleness.py +0 -0
  715. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_pr_churn.py +0 -0
  716. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_pypi.py +0 -0
  717. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_registry.py +0 -0
  718. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_release_cordon_probe.py +0 -0
  719. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_timer_active.py +0 -0
  720. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_toolchain.py +0 -0
  721. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_unit_drift.py +0 -0
  722. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_unit_enablement.py +0 -0
  723. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_health_wedged_drive_queue.py +0 -0
  724. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_hooks.py +0 -0
  725. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_human_attended_437.py +0 -0
  726. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_init.py +0 -0
  727. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_install_agent_venv_2911.py +0 -0
  728. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_integration.py +0 -0
  729. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_interactive.py +0 -0
  730. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_interactive_briefing_echo.py +0 -0
  731. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_interactive_pane_log_2541.py +0 -0
  732. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_interactive_prefill_state.py +0 -0
  733. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_interactive_session_relaunch.py +0 -0
  734. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_interactive_test_verdict_backstop.py +0 -0
  735. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_interactive_token_attribution.py +0 -0
  736. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_interactive_worktree.py +0 -0
  737. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_invariant_alarms.py +0 -0
  738. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_issue_store_seam.py +0 -0
  739. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_issues_sync_status.py +0 -0
  740. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_liveness_auditor.py +0 -0
  741. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_liveness_notify.py +0 -0
  742. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_lock_contention_ratchet.py +0 -0
  743. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_machine_fault.py +0 -0
  744. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_machine_metrics.py +0 -0
  745. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_machine_onboard.py +0 -0
  746. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_machine_pause.py +0 -0
  747. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_machine_stats.py +0 -0
  748. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_merge_queue.py +0 -0
  749. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_merge_verify.py +0 -0
  750. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_milestone_chat.py +0 -0
  751. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_milestone_dispatch.py +0 -0
  752. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_milestone_gate.py +0 -0
  753. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_milestone_order.py +0 -0
  754. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_milestone_seam.py +0 -0
  755. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_mock_author.py +0 -0
  756. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_model_tiering.py +0 -0
  757. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_models.py +0 -0
  758. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_models_config_labels.py +0 -0
  759. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_needs_attention.py +0 -0
  760. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_network.py +0 -0
  761. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_new_issue_chat.py +0 -0
  762. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_next_release_tag.py +0 -0
  763. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_node_shim.py +0 -0
  764. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notifier_baseline.py +0 -0
  765. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notifier_cli.py +0 -0
  766. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notifier_collect.py +0 -0
  767. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notifier_config.py +0 -0
  768. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notifier_drive_seam.py +0 -0
  769. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notifier_isolation.py +0 -0
  770. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notifier_predicate.py +0 -0
  771. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notifier_quiet_hours.py +0 -0
  772. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notifier_service.py +0 -0
  773. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notify.py +0 -0
  774. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_notify_drain.py +0 -0
  775. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_openapi.py +0 -0
  776. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_operational_defaults.py +0 -0
  777. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_overlap_fence.py +0 -0
  778. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_overlap_predict.py +0 -0
  779. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_packaged_deploy_units.py +0 -0
  780. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_parentage.py +0 -0
  781. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_paste_landed.py +0 -0
  782. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  783. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_pipeline.py +0 -0
  784. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_plan_followup_approve_plan_command.py +0 -0
  785. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_plan_followup_pr_command.py +0 -0
  786. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_plan_followup_review_command.py +0 -0
  787. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_plan_only.py +0 -0
  788. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_plan_parser.py +0 -0
  789. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_platform_paths.py +0 -0
  790. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_portal_bridge.py +0 -0
  791. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_portal_config.py +0 -0
  792. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_portal_store.py +0 -0
  793. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_portal_sync.py +0 -0
  794. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_pr_body_lint.py +0 -0
  795. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_prereqs.py +0 -0
  796. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_production_db_guard.py +0 -0
  797. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_progress.py +0 -0
  798. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_provider_seam.py +0 -0
  799. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_providers.py +0 -0
  800. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_providers_config_labels.py +0 -0
  801. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_providers_pty.py +0 -0
  802. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_provision_core.py +0 -0
  803. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_provision_machine.py +0 -0
  804. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_py_rust_mirror_inventory.py +0 -0
  805. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_quiet_hours.py +0 -0
  806. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_quiet_hours_store_2146.py +0 -0
  807. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reap_merged_sessions.py +0 -0
  808. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reap_stale_interactive_tick.py +0 -0
  809. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reconcile.py +0 -0
  810. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reconcile_branch.py +0 -0
  811. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reconcile_completions.py +0 -0
  812. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  813. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reconcile_merges.py +0 -0
  814. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reconcile_no_agent_record.py +0 -0
  815. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reconcile_tick.py +0 -0
  816. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_reconcile_usage_limit_done.py +0 -0
  817. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_refine_chat.py +0 -0
  818. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_cordon_2101.py +0 -0
  819. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  820. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_cordon_deadlock_2240.py +0 -0
  821. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  822. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_cordon_stuck_2490.py +0 -0
  823. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_propagate.py +0 -0
  824. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_propagate_threshold.py +0 -0
  825. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_roll_between_legs_2854.py +0 -0
  826. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_roll_window_handoff.py +0 -0
  827. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_unified_1242.py +0 -0
  828. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_verify.py +0 -0
  829. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_release_window.py +0 -0
  830. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_remote_auto_prune.py +0 -0
  831. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_remote_interactive_reaper.py +0 -0
  832. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_repo_add.py +0 -0
  833. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_repo_dormancy.py +0 -0
  834. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_repo_edit_2220.py +0 -0
  835. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_repo_graph_fleet_2237.py +0 -0
  836. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_repo_max_parallel_3423.py +0 -0
  837. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_repo_onboard_2220.py +0 -0
  838. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_report_result_push.py +0 -0
  839. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_restart_cmd.py +0 -0
  840. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_retry.py +0 -0
  841. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_retry_advisory_1606.py +0 -0
  842. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_retry_escalation_classify_3360.py +0 -0
  843. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_retry_type_1636.py +0 -0
  844. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_revalidate.py +0 -0
  845. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_review.py +0 -0
  846. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_review_end_review_without_verdict.py +0 -0
  847. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_review_parse_failure_diagnostic.py +0 -0
  848. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_review_reaffirm.py +0 -0
  849. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_review_state.py +0 -0
  850. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_review_verdict_backstop.py +0 -0
  851. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_review_verdict_override_audit.py +0 -0
  852. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_review_verdict_relay.py +0 -0
  853. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_review_zero_commits.py +0 -0
  854. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_scoped_review_wiring.py +0 -0
  855. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_scorecard.py +0 -0
  856. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_self_health.py +0 -0
  857. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_serve.py +0 -0
  858. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_serve_app.py +0 -0
  859. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_serve_app_board_trim.py +0 -0
  860. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_serve_rest_routes.py +0 -0
  861. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_session.py +0 -0
  862. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_slice_issue_attribution.py +0 -0
  863. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_smoke.py +0 -0
  864. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  865. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_smoke_live_checkout_restore.py +0 -0
  866. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_smoke_workflow.py +0 -0
  867. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_spend_ceiling.py +0 -0
  868. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_spend_ceiling_coordinator.py +0 -0
  869. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_split.py +0 -0
  870. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_split_work.py +0 -0
  871. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_stage_projection.py +0 -0
  872. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_stale_busy_reviewer_697.py +0 -0
  873. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_stalled_pipeline.py +0 -0
  874. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_state.py +0 -0
  875. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_state_review_findings_daemon.py +0 -0
  876. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_status_fleet_footer.py +0 -0
  877. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_stop_1567.py +0 -0
  878. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_store_contract.py +0 -0
  879. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_store_migrate.py +0 -0
  880. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_stuck.py +0 -0
  881. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  882. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_terminal_command.py +0 -0
  883. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_test_author.py +0 -0
  884. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_test_chat.py +0 -0
  885. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_test_orchestrator.py +0 -0
  886. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_test_report.py +0 -0
  887. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_test_verdict_parsing.py +0 -0
  888. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_test_verdict_transcript_floor.py +0 -0
  889. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_text_io_encoding_audit.py +0 -0
  890. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_thin_client_board_audit.py +0 -0
  891. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_thin_client_config_load_1080.py +0 -0
  892. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_thin_client_daemon_routing_906.py +0 -0
  893. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_throwaway_vm.py +0 -0
  894. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_tmux_host.py +0 -0
  895. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_tmux_session.py +0 -0
  896. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_transcript_floor.py +0 -0
  897. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_uat_checks.py +0 -0
  898. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_usage.py +0 -0
  899. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_usage_limits.py +0 -0
  900. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_usage_rollup.py +0 -0
  901. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_venv_live_install_2121.py +0 -0
  902. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_version_single_source.py +0 -0
  903. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_watch.py +0 -0
  904. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  905. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_worker_env_venv_isolation.py +0 -0
  906. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_worker_events.py +0 -0
  907. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_worker_image_pin_sync.py +0 -0
  908. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_worker_safety.py +0 -0
  909. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_worker_test_scoping.py +0 -0
  910. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_worktree.py +0 -0
  911. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  912. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/tests/test_write_parity.py +0 -0
  913. {code_coordinator-0.5.530 → code_coordinator-0.5.532}/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.530
3
+ Version: 0.5.532
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
@@ -28,10 +28,14 @@ Requires-Dist: websockets>=12.0; extra == "server"
28
28
  Requires-Dist: psutil>=5.9; extra == "server"
29
29
  Provides-Extra: postgres
30
30
  Requires-Dist: psycopg[binary]>=3.1; extra == "postgres"
31
+ Provides-Extra: reports-xlsx
32
+ Requires-Dist: openpyxl>=3.1; extra == "reports-xlsx"
31
33
  Provides-Extra: all
32
34
  Requires-Dist: code-coordinator[server]; extra == "all"
35
+ Requires-Dist: code-coordinator[reports-xlsx]; extra == "all"
33
36
  Provides-Extra: dev
34
37
  Requires-Dist: code-coordinator[server]; extra == "dev"
38
+ Requires-Dist: code-coordinator[reports-xlsx]; extra == "dev"
35
39
  Requires-Dist: pytest>=8.0; extra == "dev"
36
40
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
37
41
  Requires-Dist: pytest-xdist>=3.5; extra == "dev"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.530
3
+ Version: 0.5.532
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
@@ -28,10 +28,14 @@ Requires-Dist: websockets>=12.0; extra == "server"
28
28
  Requires-Dist: psutil>=5.9; extra == "server"
29
29
  Provides-Extra: postgres
30
30
  Requires-Dist: psycopg[binary]>=3.1; extra == "postgres"
31
+ Provides-Extra: reports-xlsx
32
+ Requires-Dist: openpyxl>=3.1; extra == "reports-xlsx"
31
33
  Provides-Extra: all
32
34
  Requires-Dist: code-coordinator[server]; extra == "all"
35
+ Requires-Dist: code-coordinator[reports-xlsx]; extra == "all"
33
36
  Provides-Extra: dev
34
37
  Requires-Dist: code-coordinator[server]; extra == "dev"
38
+ Requires-Dist: code-coordinator[reports-xlsx]; extra == "dev"
35
39
  Requires-Dist: pytest>=8.0; extra == "dev"
36
40
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
37
41
  Requires-Dist: pytest-xdist>=3.5; extra == "dev"
@@ -8,9 +8,11 @@ tzdata
8
8
 
9
9
  [all]
10
10
  code-coordinator[server]
11
+ code-coordinator[reports-xlsx]
11
12
 
12
13
  [dev]
13
14
  code-coordinator[server]
15
+ code-coordinator[reports-xlsx]
14
16
  pytest>=8.0
15
17
  pytest-asyncio>=0.23
16
18
  pytest-xdist>=3.5
@@ -21,6 +23,9 @@ wheel
21
23
  [postgres]
22
24
  psycopg[binary]>=3.1
23
25
 
26
+ [reports-xlsx]
27
+ openpyxl>=3.1
28
+
24
29
  [server]
25
30
  starlette>=0.37
26
31
  uvicorn>=0.30
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.530",
2
+ "tag": "0.5.532",
3
3
  "distance": 0,
4
- "node": "g8cda204e6985ec5ea0eca258916e347e9f330342",
4
+ "node": "ga69005346d9332617f56dbceb66b67c41a1e2d78",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-28"
@@ -40,6 +40,7 @@ __all__ = [
40
40
  "query_audit_log",
41
41
  "audit_lock_contention_losses",
42
42
  "flush_lock_contention_summary",
43
+ "sweep_operational_retention",
43
44
  ]
44
45
 
45
46
  # Valid values are documented in the issue but not enforced here — callers
@@ -276,9 +277,14 @@ def _maybe_trim(conn) -> None:
276
277
  """Opportunistic cap: when ``audit.max_rows`` is set (> 0), delete the
277
278
  oldest rows past that count after every insert.
278
279
 
279
- Default (``max_rows=0``) is unlimited — this is a no-op in the common
280
- case. Config is read via :func:`_cached_config` rather than re-parsed
281
- on every call — see that function's docstring for why (#2654).
280
+ **Tier-blind** (see :class:`coord.config.AuditConfig`'s ``max_rows``
281
+ docstring): this deletes the globally oldest rows by ``id`` regardless
282
+ of ``tier``, so a busy ``operational``-tier writer can push a
283
+ ``business``-tier row out ahead of it. Default (``max_rows=0``) is
284
+ unlimited — this is a no-op in the common case. Config is read via
285
+ :func:`_cached_config` rather than re-parsed on every call — see that
286
+ function's docstring for why (#2654). Use
287
+ :func:`sweep_operational_retention` for a tier-scoped cap instead.
282
288
  """
283
289
  max_rows = _resolve_max_rows()
284
290
  if max_rows <= 0:
@@ -292,6 +298,70 @@ def _maybe_trim(conn) -> None:
292
298
  conn.commit()
293
299
 
294
300
 
301
+ # ── #3469: per-tier retention for the operational tier ──────────────────────
302
+ #
303
+ # `_maybe_trim` above is a row-count cap, tier-blind by construction (it has
304
+ # to be: `max_rows` predates the `tier` column's operational-vs-business
305
+ # distinction even mattering for retention). #3469's actual problem --
306
+ # `forge_availability`'s ~100k operational-tier rows/day dwarfing the whole
307
+ # table -- needs a cap that can bound just that tier without ever being able
308
+ # to touch a `business`-tier row (a real board transition: dispatch, test/
309
+ # review/merge verdicts) no matter how old it is. This is that cap: a plain
310
+ # time-window DELETE scoped to `tier = 'operational'`, wired into
311
+ # `coord.housekeeping.sweep`'s low-cadence tick (and `coord housekeeping`'s
312
+ # on-demand run) rather than firing on every insert like `_maybe_trim` does
313
+ # — the same cadence tradeoff `coord.forge_availability._PRUNE_INTERVAL_S`
314
+ # already documents for the exact same reason.
315
+
316
+
317
+ def _resolve_operational_retention_days() -> float:
318
+ """Read ``audit.operational_retention_days`` from coordinator.yml.
319
+ Returns ``0`` (disabled — keep everything, today's behaviour) on any
320
+ failure, matching :func:`_resolve_max_rows`'s fail-safe."""
321
+ try:
322
+ cfg = _cached_config()
323
+ return max(0.0, float(cfg.audit.operational_retention_days))
324
+ except Exception: # noqa: BLE001 — best-effort; disabled is the safe default
325
+ return 0.0
326
+
327
+
328
+ def sweep_operational_retention(*, now: float | None = None, dry_run: bool = False) -> int:
329
+ """Delete ``tier='operational'`` ``audit_log`` rows older than
330
+ ``audit.operational_retention_days`` (#3469). Returns the number of
331
+ rows deleted (or, with ``dry_run=True``, that *would be* deleted) —
332
+ ``0`` when the knob is unset/disabled (the default) or there was
333
+ nothing past the cutoff.
334
+
335
+ **Never touches a ``business``-tier row**, regardless of age — the
336
+ ``WHERE tier = 'operational'`` clause is the whole point of this
337
+ function existing alongside the tier-blind :func:`_maybe_trim`.
338
+
339
+ Unlike ``record_audit``'s best-effort contract (a board mutation must
340
+ never fail because its audit row didn't write), this is explicit,
341
+ on-demand maintenance (``coord housekeeping``, or the daemon's
342
+ low-cadence tick calling the same path) — a failure here should
343
+ surface to whoever ran it, not vanish into a debug log.
344
+ """
345
+ days = _resolve_operational_retention_days()
346
+ if days <= 0:
347
+ return 0
348
+ now = now if now is not None else time.time()
349
+ cutoff = now - days * 86400.0
350
+ conn = get_connection()
351
+ if dry_run:
352
+ row = sql.execute(
353
+ conn,
354
+ "SELECT COUNT(*) FROM audit_log WHERE tier = 'operational' AND ts < ?",
355
+ (cutoff,),
356
+ ).fetchone()
357
+ return int(row[0]) if row else 0
358
+ cur = sql.execute(
359
+ conn, "DELETE FROM audit_log WHERE tier = 'operational' AND ts < ?", (cutoff,),
360
+ )
361
+ conn.commit()
362
+ return cur.rowcount if cur.rowcount and cur.rowcount > 0 else 0
363
+
364
+
295
365
  # ── #2654: cached config reads for the two per-write resolvers below ───────
296
366
  #
297
367
  # `_resolve_level` and `_resolve_max_rows` both used to call `coord.config.
@@ -30,23 +30,47 @@ def _print_housekeeping_result(resp: dict) -> None:
30
30
  # this sweep did, so a run that only reclaimed leaked worktrees must not
31
31
  # print "nothing to archive" and hide it.
32
32
  removed_wt = resp.get("removed_confirm_worktrees", 0)
33
- if not archived_a and not archived_n and not removed_wt:
33
+ # #3469: the operational-tier audit retention sweep runs unconditionally
34
+ # (its own knob, its own window — see `coord.housekeeping.sweep`'s
35
+ # docstring), independent of everything above, and must be reported on
36
+ # its own terms too: once `audit.operational_retention_days` is turned
37
+ # on, a tick that *only* deletes stale operational audit rows will be
38
+ # the common case, and silently folding it into the "nothing to
39
+ # archive" branch would hide the one thing #3469 exists to report.
40
+ audit_deleted = resp.get("audit_operational_deleted", 0)
41
+ # #3469: `reclaim=True` can be the only thing a run did (e.g. an
42
+ # operator running `coord housekeeping --reclaim` against a DB with
43
+ # nothing currently stale) — it must not go unreported just because
44
+ # nothing else fired.
45
+ reclaimed = bool(resp.get("reclaimed"))
46
+ nothing_archived = not archived_a and not archived_n and not removed_wt and not audit_deleted
47
+ if nothing_archived:
34
48
  click.echo(
35
49
  f"housekeeping: nothing to archive (no terminal rows older than {days}d)."
36
50
  )
37
- return
38
- verb = "would archive" if dry else "archived"
39
- suffix = " (dry-run — nothing moved)" if dry else ""
40
- click.echo(
41
- f"housekeeping: {verb} {archived_a} assignment(s) + "
42
- f"{archived_n} notification(s) (terminal, older than {days}d).{suffix}"
43
- )
51
+ if not reclaimed:
52
+ return
53
+ if archived_a or archived_n:
54
+ verb = "would archive" if dry else "archived"
55
+ suffix = " (dry-run — nothing moved)" if dry else ""
56
+ click.echo(
57
+ f"housekeeping: {verb} {archived_a} assignment(s) + "
58
+ f"{archived_n} notification(s) (terminal, older than {days}d).{suffix}"
59
+ )
44
60
  if removed_wt:
45
61
  wt_verb = "would remove" if dry else "removed"
46
62
  click.echo(
47
63
  f"housekeeping: {wt_verb} {removed_wt} stale confirm-worktree(s) "
48
64
  "(#2974)."
49
65
  )
66
+ if audit_deleted:
67
+ audit_verb = "would delete" if dry else "deleted"
68
+ click.echo(
69
+ f"housekeeping: {audit_verb} {audit_deleted} stale operational "
70
+ "audit_log row(s) (#3469)."
71
+ )
72
+ if reclaimed:
73
+ click.echo("housekeeping: reclaimed disk space (VACUUM) (#3469).")
50
74
 
51
75
 
52
76
  @click.command(
@@ -58,8 +82,13 @@ def _print_housekeeping_result(resp: dict) -> None:
58
82
  "Moves terminal assignments older than COORD_ARCHIVE_RETENTION_DAYS "
59
83
  "(default 30) + their notifications into assignments_archive / "
60
84
  "notifications_archive — it NEVER deletes, and never touches active, "
61
- "recent, merge-queued, open-issue-latest, or review-linked rows. Routes "
62
- "through the daemon (the canonical DB lives there)."
85
+ "recent, merge-queued, open-issue-latest, or review-linked rows. Also "
86
+ "runs the #3469 operational-tier audit_log retention sweep (deletes "
87
+ "stale tier='operational' rows only, per audit.operational_retention_days "
88
+ "— business-tier rows are never touched). Pass --reclaim to also VACUUM "
89
+ "(dialect-routed) afterwards, so those DELETEs actually shrink the "
90
+ "on-disk DB — see 'coord housekeeping --help' for that flag's own "
91
+ "detail. Routes through the daemon (the canonical DB lives there)."
63
92
  ),
64
93
  )
65
94
 
@@ -69,9 +98,18 @@ def _print_housekeeping_result(resp: dict) -> None:
69
98
  is_flag=True,
70
99
  help="Report what would be archived without moving anything.",
71
100
  )
72
-
73
-
74
- def housekeeping(dry_run: bool) -> None:
101
+ @click.option(
102
+ "--reclaim",
103
+ is_flag=True,
104
+ help=(
105
+ "#3469: after every archive/delete above has run, also run a "
106
+ "dialect-routed space-reclaim pass (SQLite VACUUM; Postgres VACUUM) "
107
+ "so a retention sweep's DELETEs actually shrink the on-disk DB "
108
+ "artifact. One-off, operator-invoked — never run automatically by "
109
+ "the daemon's low-cadence tick. No-op when combined with --dry-run."
110
+ ),
111
+ )
112
+ def housekeeping(dry_run: bool, reclaim: bool) -> None:
75
113
  """#762: archive stale terminal board rows (active/recent/referenced kept)."""
76
114
  from coord.board_service import daemon_reroute_target # noqa: PLC0415
77
115
 
@@ -80,7 +118,12 @@ def housekeeping(dry_run: bool) -> None:
80
118
  from coord.client import post_record # noqa: PLC0415
81
119
 
82
120
  try:
83
- resp = post_record(_svc, "/housekeeping", {"dry_run": dry_run}, timeout=180.0)
121
+ resp = post_record(
122
+ _svc,
123
+ "/housekeeping",
124
+ {"dry_run": dry_run, "reclaim": reclaim},
125
+ timeout=180.0,
126
+ )
84
127
  except Exception as exc: # noqa: BLE001
85
128
  click.echo(f"error: housekeeping via daemon failed: {exc}", err=True)
86
129
  sys.exit(1)
@@ -89,7 +132,7 @@ def housekeeping(dry_run: bool) -> None:
89
132
 
90
133
  from coord import housekeeping as _hk # noqa: PLC0415
91
134
 
92
- _print_housekeeping_result(_hk.sweep(dry_run=dry_run))
135
+ _print_housekeeping_result(_hk.sweep(dry_run=dry_run, reclaim=reclaim))
93
136
 
94
137
 
95
138
  @click.command(help="Poll agents and post completion/failure comments on GitHub.")
@@ -12,18 +12,24 @@ one report as a plain table plus its notes block; ``--format json`` emits
12
12
  the ``ReportResult`` verbatim — the same bytes the daemon's
13
13
  ``GET /report/{id}`` returns for the same window.
14
14
 
15
- ``--format csv`` (#1765) writes the machine-readable form to stdout, so it
16
- pipes and redirects normally. It calls :func:`coord.reports.result_to_csv`
17
- on the **raw wire result** — the same function, on the same input, that
18
- ``GET /report/{id}?format=csv`` calls — rather than re-serialising the human
19
- table above. That is deliberate and load-bearing twice over: it is why the
20
- CLI and the daemon emit identical bytes, and it is why ``started_at``
21
- exports as an epoch instead of the ``13h ago`` that ``_format_cell``
22
- renders. ``--json`` survives as a hidden alias for ``--format json``.
15
+ ``--format csv|ndjson|md|xlsx`` (#1765, extended by #3472) write a
16
+ machine/human-readable export to stdout, so it pipes and redirects normally.
17
+ Each one dispatches through :data:`coord.reports.EXPORT_FORMATS` on the
18
+ **raw wire result** — the same table, on the same input, that
19
+ ``GET /report/{id}?format=<fmt>`` dispatches through — rather than
20
+ re-serialising the human table above. That is deliberate and load-bearing
21
+ twice over: it is why the CLI and the daemon emit identical bytes, and it is
22
+ why ``started_at`` exports as an epoch (or a real Excel datetime cell for
23
+ ``xlsx``) instead of the ``13h ago`` that ``_format_cell`` renders.
24
+ ``--format xlsx`` needs the optional ``reports-xlsx`` extra
25
+ (``openpyxl``); without it, this exits ``2`` with a message naming the
26
+ extra rather than a crash. ``--json`` survives as a hidden alias for
27
+ ``--format json``.
23
28
 
24
29
  Exit codes: ``2`` for a bad request (unknown report, unknown parameter, bad
25
- value — the message names what was allowed), ``1`` for a read/transport
26
- failure. Never a traceback for either.
30
+ value, or ``--format xlsx`` without the extra installed — the message names
31
+ what was allowed/needed), ``1`` for a read/transport failure. Never a
32
+ traceback for either.
27
33
  """
28
34
 
29
35
  from __future__ import annotations
@@ -265,10 +271,14 @@ def report_list(
265
271
  )
266
272
  @click.option(
267
273
  "--format", "output_format",
268
- type=click.Choice(["table", "json", "csv"]),
274
+ type=click.Choice(["table", "json", "csv", "ndjson", "md", "xlsx"]),
269
275
  default="table",
270
276
  show_default=True,
271
- help="Output encoding: human table, raw ReportResult JSON, or CSV.",
277
+ help=(
278
+ "Output encoding: human table, raw ReportResult JSON, CSV, "
279
+ "newline-delimited JSON, a markdown table, or an .xlsx workbook "
280
+ "(#3472; needs the 'reports-xlsx' extra)."
281
+ ),
272
282
  )
273
283
  @click.option(
274
284
  "--json", "legacy_json", is_flag=True, default=False, hidden=True,
@@ -318,18 +328,29 @@ def report_run(
318
328
  click.echo(_json.dumps(result, indent=2, default=str))
319
329
  return
320
330
 
321
- if output_format == "csv":
322
- # #1765: the *server's* serializer, applied to the raw wire result —
323
- # never a re-serialisation of the human table. That is what makes
324
- # these bytes identical to `GET /report/{id}?format=csv`, and what
325
- # keeps `started_at` an epoch instead of the `13h ago` this module
326
- # renders two functions up.
327
- from coord.reports import result_to_csv # noqa: PLC0415
328
-
329
- # nl=False: the serializer already terminates every line, and click
330
- # would otherwise append a stray blank line that the daemon's bytes
331
- # do not have.
332
- click.echo(result_to_csv(result), nl=False)
331
+ if output_format in ("csv", "ndjson", "md", "xlsx"):
332
+ # #1765 / #3472: the *server's* serializer, applied to the raw wire
333
+ # result — never a re-serialisation of the human table. That is what
334
+ # makes these bytes identical to `GET /report/{id}?format=<fmt>`, and
335
+ # what keeps `started_at` an epoch instead of the `13h ago` this
336
+ # module renders two functions up. `EXPORT_FORMATS` is the single
337
+ # table every surface (CLI, daemon, dashboard) dispatches through —
338
+ # see `coord.reports.EXPORT_FORMATS`.
339
+ from coord.reports import EXPORT_FORMATS, XlsxExtraMissingError # noqa: PLC0415
340
+
341
+ export = EXPORT_FORMATS[output_format]
342
+ try:
343
+ body = export.serialize(result)
344
+ except XlsxExtraMissingError as e:
345
+ click.echo(f"error: {e}", err=True)
346
+ raise SystemExit(2) from e
347
+ # nl=False: the serializer already terminates every line (text
348
+ # formats) or is a self-contained binary blob (xlsx), and click
349
+ # would otherwise append a stray blank line/byte that the daemon's
350
+ # bytes do not have. click.echo writes bytes straight to the binary
351
+ # stream when given bytes, so xlsx round-trips undamaged even on a
352
+ # platform whose stdout does newline translation.
353
+ click.echo(body, nl=False)
333
354
  return
334
355
 
335
356
  window = result.get("window") or [None, None]
@@ -1658,15 +1658,21 @@ class StoreConfig:
1658
1658
 
1659
1659
  @dataclass
1660
1660
  class AuditConfig:
1661
- """``audit:`` block (#1036/#1038) — the append-only ``audit_log``
1661
+ """``audit:`` block (#1036/#1038/#3469) — the append-only ``audit_log``
1662
1662
  table's tunables.
1663
1663
 
1664
- ``max_rows`` is a future retention cap, not a pruning sweep: when set
1665
- above the default ``0`` (unlimited), :func:`coord.audit.record_audit`
1666
- opportunistically deletes the oldest rows past that count after every
1667
- insert. ``0`` means keep everything forever — the default for this
1668
- milestone, since retention policy is explicitly out of scope (see the
1669
- issue's "Out of scope" section).
1664
+ ``max_rows`` is a **tier-blind** retention cap, not a pruning sweep: when
1665
+ set above the default ``0`` (unlimited), :func:`coord.audit._maybe_trim`
1666
+ opportunistically deletes the oldest rows *by ``id``, across every tier*
1667
+ past that count after every insert. Plainly: capping ``max_rows`` on a
1668
+ busy ``operational``-tier writer (e.g. #1896's ``forge_availability``)
1669
+ can just as easily delete ``business``-tier history (dispatch / test /
1670
+ review / merge verdicts) to make room — it has no concept of tier at
1671
+ all. ``0`` means keep everything forever, still the default (retention
1672
+ policy was explicitly out of scope for the milestone that introduced
1673
+ this field). Use ``operational_retention_days`` below when the intent is
1674
+ "bound the operational tier without ever touching business rows" —
1675
+ that is the tier-aware knob #3469 added for exactly this gap.
1670
1676
 
1671
1677
  ``level`` (#1038) selects how much of the audit taxonomy is captured:
1672
1678
  ``"business"`` records only real board transitions (dispatch, verdicts,
@@ -1676,10 +1682,46 @@ class AuditConfig:
1676
1682
  ``tier="operational"``, ``actor="daemon"``. Business-tier rows are
1677
1683
  always recorded regardless of ``level`` — this only gates the
1678
1684
  operational tier.
1685
+
1686
+ ``operational_retention_days`` (#3469) is a time-window retention sweep
1687
+ scoped to ``tier="operational"`` rows only — :func:`coord.audit.
1688
+ sweep_operational_retention` deletes ``operational`` rows older than
1689
+ this many days and never touches a ``business`` row, no matter how old.
1690
+ Default ``0`` disables the sweep entirely (today's behaviour: keep
1691
+ everything). Wired into :func:`coord.housekeeping.sweep`'s low-cadence
1692
+ tick, same as every other retention sweep in this codebase.
1679
1693
  """
1680
1694
 
1681
1695
  max_rows: int = 0
1682
1696
  level: str = "operational"
1697
+ operational_retention_days: float = 0.0
1698
+
1699
+
1700
+ @dataclass
1701
+ class ForgeAvailabilityConfig:
1702
+ """``forge_availability:`` block (#3469) — retention tuning for the
1703
+ ``category="forge_availability"`` rows :mod:`coord.forge_availability`
1704
+ writes into ``audit_log`` (#1896/#2654/#2988).
1705
+
1706
+ ``retention_days`` bounds how long a ``forge_availability`` row survives
1707
+ before :func:`coord.forge_availability._maybe_prune` deletes it. Default
1708
+ (30) is scoped to what ``coord diagnose --forge-availability`` actually
1709
+ reads by default (its own ``--window-days`` defaults to 30) rather than
1710
+ the historical hardcoded 90 — #3469 measured the 90-day steady state at
1711
+ ~9M rows / ~3GB for this one category alone. ``90`` remains the
1712
+ documented ceiling (:data:`coord.forge_availability.RETENTION_DAYS`):
1713
+ any configured value above it is silently clamped down to 90, never up
1714
+ — a config typo should not accidentally uncap the sweep.
1715
+
1716
+ Note the ``0`` asymmetry against ``AuditConfig.operational_retention_days``
1717
+ above: there ``0`` means "sweep disabled, keep everything forever". Here
1718
+ ``0``/negative is rejected outright (must be a positive number) — there is
1719
+ no "never prune forge_availability" concept, since #1896/#2654/#2988 is
1720
+ exactly the unbounded-growth problem this knob exists to prevent, and
1721
+ disabling it by config would silently reopen that gap.
1722
+ """
1723
+
1724
+ retention_days: float = 30.0
1683
1725
 
1684
1726
 
1685
1727
  @dataclass
@@ -2439,6 +2481,9 @@ class Config:
2439
2481
  milestone: MilestoneConfig = field(default_factory=MilestoneConfig)
2440
2482
  providers: ProvidersConfig = field(default_factory=ProvidersConfig)
2441
2483
  audit: AuditConfig = field(default_factory=AuditConfig)
2484
+ forge_availability: ForgeAvailabilityConfig = field(
2485
+ default_factory=ForgeAvailabilityConfig
2486
+ )
2442
2487
  pricing: PricingConfig = field(default_factory=PricingConfig)
2443
2488
  health: HealthConfig = field(default_factory=HealthConfig)
2444
2489
  # #1632 — absent block == disabled == today's behaviour (silence).
@@ -2706,6 +2751,7 @@ def parse_mapping(raw: Any, *, path: Path | None = None) -> Config:
2706
2751
  propagation = _parse_propagation(raw.get("propagation"))
2707
2752
  milestone = _parse_milestone(raw.get("milestone"))
2708
2753
  audit = _parse_audit(raw.get("audit"))
2754
+ forge_availability = _parse_forge_availability(raw.get("forge_availability"))
2709
2755
  pricing = _parse_pricing(raw.get("pricing"))
2710
2756
  health = _parse_health(raw.get("health"))
2711
2757
  notifications = _parse_notifications(raw.get("notifications"))
@@ -2731,6 +2777,7 @@ def parse_mapping(raw: Any, *, path: Path | None = None) -> Config:
2731
2777
  milestone=milestone,
2732
2778
  providers=providers,
2733
2779
  audit=audit,
2780
+ forge_availability=forge_availability,
2734
2781
  pricing=pricing,
2735
2782
  health=health,
2736
2783
  notifications=notifications,
@@ -4626,6 +4673,34 @@ def _parse_audit(raw: Any) -> AuditConfig:
4626
4673
  f"audit.level must be one of {_VALID_AUDIT_LEVELS!r}, got {value!r}"
4627
4674
  )
4628
4675
  cfg.level = value
4676
+ if "operational_retention_days" in raw:
4677
+ value = raw["operational_retention_days"]
4678
+ if isinstance(value, bool) or not isinstance(value, (int, float)) or value < 0:
4679
+ raise ConfigError(
4680
+ "audit.operational_retention_days must be a non-negative number"
4681
+ )
4682
+ cfg.operational_retention_days = float(value)
4683
+ return cfg
4684
+
4685
+
4686
+ def _parse_forge_availability(raw: Any) -> ForgeAvailabilityConfig:
4687
+ """Parse the optional ``forge_availability:`` block (#3469).
4688
+
4689
+ An absent block returns ``ForgeAvailabilityConfig()`` — the new 30-day
4690
+ default, itself a deliberate change from the pre-#3469 hardcoded 90-day
4691
+ retention (see that dataclass's docstring for the measured why).
4692
+ """
4693
+ if raw is None:
4694
+ return ForgeAvailabilityConfig()
4695
+ if not isinstance(raw, dict):
4696
+ raise ConfigError("'forge_availability' must be a mapping")
4697
+
4698
+ cfg = ForgeAvailabilityConfig()
4699
+ if "retention_days" in raw:
4700
+ value = raw["retention_days"]
4701
+ if isinstance(value, bool) or not isinstance(value, (int, float)) or value <= 0:
4702
+ raise ConfigError("forge_availability.retention_days must be a positive number")
4703
+ cfg.retention_days = float(value)
4629
4704
  return cfg
4630
4705
 
4631
4706
 
@@ -1740,12 +1740,20 @@ def openapi_spec() -> dict:
1740
1740
  "name": "format",
1741
1741
  "in": "query",
1742
1742
  "required": False,
1743
- "schema": {"type": "string", "enum": ["json", "csv"]},
1743
+ "schema": {
1744
+ "type": "string",
1745
+ "enum": ["json", "csv", "ndjson", "md", "xlsx"],
1746
+ },
1744
1747
  "description": (
1745
- "#1765: response encoding. Absent/`json` returns "
1746
- "the ReportResult unchanged; `csv` returns "
1747
- "text/csv (raw values, `#`-prefixed notes) with "
1748
- "a Content-Disposition filename."
1748
+ "#1765/#3472: response encoding. Absent/`json` "
1749
+ "returns the ReportResult unchanged; `csv` "
1750
+ "returns text/csv (raw values, `#`-prefixed "
1751
+ "notes); `ndjson` one JSON object per line; "
1752
+ "`md` a markdown table plus notes; `xlsx` a "
1753
+ "typed-cell workbook (needs the `reports-xlsx` "
1754
+ "extra server-side — a 400 names it if "
1755
+ "missing). Every non-JSON format ships a "
1756
+ "Content-Disposition filename."
1749
1757
  ),
1750
1758
  },
1751
1759
  ],
@@ -1763,10 +1771,40 @@ def openapi_spec() -> dict:
1763
1771
  "lines."
1764
1772
  ),
1765
1773
  },
1774
+ "application/x-ndjson": {
1775
+ "schema": {"type": "string"},
1776
+ "description": (
1777
+ "`?format=ndjson`. One JSON object per "
1778
+ "line: a leading `_meta` line, one "
1779
+ "`_note` line per note, one line per "
1780
+ "data row, a trailing `_totals` line "
1781
+ "when the report has one."
1782
+ ),
1783
+ },
1784
+ "text/markdown": {
1785
+ "schema": {"type": "string"},
1786
+ "description": (
1787
+ "`?format=md`. A pipe table labelled "
1788
+ "from `column_meta` plus a trailing "
1789
+ "`## Notes` list."
1790
+ ),
1791
+ },
1792
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
1793
+ "schema": {"type": "string", "format": "binary"},
1794
+ "description": (
1795
+ "`?format=xlsx`. A `Report` sheet (typed "
1796
+ "cells, plus a totals row) and a `Notes` "
1797
+ "sheet."
1798
+ ),
1799
+ },
1766
1800
  },
1767
1801
  },
1768
1802
  "400": {
1769
- "description": "Unknown parameter / bad parameter value / unknown format"
1803
+ "description": (
1804
+ "Unknown parameter / bad parameter value / "
1805
+ "unknown format / format=xlsx without the "
1806
+ "reports-xlsx extra installed"
1807
+ )
1770
1808
  },
1771
1809
  "404": {"description": "Unknown report id"},
1772
1810
  },
@@ -3611,13 +3649,16 @@ def build_app(
3611
3649
 
3612
3650
  report_id = request.path_params["report_id"]
3613
3651
  params = dict(request.query_params)
3614
- # #1765: `format` is a *rendering* choice, not a report parameter —
3615
- # pop it before validation or `resolve_params` rejects it as an
3616
- # unknown parameter.
3652
+ # #1765 / #3472: `format` is a *rendering* choice, not a report
3653
+ # parameter — pop it before validation or `resolve_params` rejects
3654
+ # it as an unknown parameter. `EXPORT_FORMATS` is the single table
3655
+ # every surface (CLI, `coord/serve_app.py`, this route) dispatches
3656
+ # through, so "what formats exist" is answered exactly once.
3617
3657
  fmt = (params.pop("format", "") or "json").strip().lower()
3618
- if fmt not in ("json", "csv"):
3658
+ if fmt != "json" and fmt not in _reports.EXPORT_FORMATS:
3659
+ allowed = ", ".join(["json", *sorted(_reports.EXPORT_FORMATS)])
3619
3660
  return JSONResponse(
3620
- {"error": f"unknown format {fmt!r} — allowed values: json, csv"},
3661
+ {"error": f"unknown format {fmt!r} — allowed values: {allowed}"},
3621
3662
  status_code=400,
3622
3663
  )
3623
3664
  try:
@@ -3633,15 +3674,23 @@ def build_app(
3633
3674
  return JSONResponse(
3634
3675
  {"error": "report run failed", "detail": str(e)}, status_code=503
3635
3676
  )
3636
- if fmt == "csv":
3677
+ if fmt != "json":
3637
3678
  # Same serializer the CLI calls, so `coord report run --format
3638
- # csv` and this route emit identical bytes for identical params.
3679
+ # <fmt>` and this route emit identical bytes for identical
3680
+ # params. `format=xlsx` without the optional `reports-xlsx`
3681
+ # extra installed raises XlsxExtraMissingError (a ReportError)
3682
+ # rather than crashing — surfaced as a 400 naming the extra.
3683
+ export = _reports.EXPORT_FORMATS[fmt]
3684
+ try:
3685
+ body = await run_in_threadpool(export.serialize, result)
3686
+ except _reports.XlsxExtraMissingError as e:
3687
+ return JSONResponse({"error": str(e)}, status_code=400)
3639
3688
  return Response(
3640
- _reports.result_to_csv(result),
3641
- media_type="text/csv; charset=utf-8",
3689
+ body,
3690
+ media_type=export.media_type,
3642
3691
  headers={
3643
3692
  "Content-Disposition": (
3644
- f'attachment; filename="{_reports.csv_filename(result)}"'
3693
+ f'attachment; filename="{export.filename(result)}"'
3645
3694
  )
3646
3695
  },
3647
3696
  )