code-coordinator 0.5.289__tar.gz → 0.5.290__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 (888) hide show
  1. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agent.py +76 -0
  5. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/portal.py +62 -8
  6. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/decomposition_chat.py +21 -0
  7. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/portal_store.py +133 -1
  8. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/serve_app.py +90 -0
  9. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_portal.py +121 -0
  10. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_decomposition_chat.py +149 -0
  11. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_portal_store.py +212 -0
  12. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_sqlite_connect_ratchet.py +13 -3
  13. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/workflows/cargo-test.yml +0 -0
  24. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/workflows/publish.yml +0 -0
  25. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/workflows/test.yml +0 -0
  26. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.gitignore +0 -0
  27. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/CLAUDE.md +0 -0
  28. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/GOAL.md +0 -0
  29. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/LICENSE +0 -0
  30. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/MANIFEST.in +0 -0
  31. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/README.md +0 -0
  32. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/SOURCES.txt +0 -0
  33. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/dependency_links.txt +0 -0
  34. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/entry_points.txt +0 -0
  35. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/requires.txt +0 -0
  36. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/scm_file_list.json +0 -0
  37. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/top_level.txt +0 -0
  38. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/__init__.py +0 -0
  39. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/_board_mapping.py +0 -0
  40. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/acceptance.py +0 -0
  41. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/acceptance_drivers.py +0 -0
  42. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/approved_work.py +0 -0
  48. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/board_bool_guard.py +0 -0
  52. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/board_schema.py +0 -0
  53. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/board_service.py +0 -0
  54. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/board_wire.py +0 -0
  55. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/brain.py +0 -0
  56. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/branch_model.py +0 -0
  57. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/bug_intake.py +0 -0
  58. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/ci_fix.py +0 -0
  60. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/ci_gitlab.py +0 -0
  62. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/ci_store.py +0 -0
  63. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/claim.py +0 -0
  64. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/client.py +0 -0
  66. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/__init__.py +0 -0
  67. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/_common.py +0 -0
  68. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/chat.py +0 -0
  72. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/dispatch.py +0 -0
  73. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/dispatch_workers.py +0 -0
  74. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/machine.py +0 -0
  81. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/merge.py +0 -0
  82. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/milestone.py +0 -0
  83. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/plan_followup.py +0 -0
  84. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/plans.py +0 -0
  85. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/pr.py +0 -0
  86. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/release.py +0 -0
  87. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/repo.py +0 -0
  88. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/report.py +0 -0
  89. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/review.py +0 -0
  90. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/scorecard.py +0 -0
  91. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/sessions.py +0 -0
  92. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/setup.py +0 -0
  93. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/status.py +0 -0
  94. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/store_migrate.py +0 -0
  95. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/terminal.py +0 -0
  96. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/test_gate.py +0 -0
  97. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/tui.py +0 -0
  98. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/comments.py +0 -0
  99. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/config.py +0 -0
  100. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/config_reload.py +0 -0
  101. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/confirm_test.py +0 -0
  102. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/conflict_fix.py +0 -0
  103. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dao.py +0 -0
  104. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dashboard/__init__.py +0 -0
  105. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dashboard/fixture.py +0 -0
  106. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dashboard/index.html +0 -0
  107. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dashboard/server.py +0 -0
  108. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dashboard/terminal.py +0 -0
  109. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/db.py +0 -0
  110. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dead_end.py +0 -0
  111. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/README.md +0 -0
  112. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-agent.service +0 -0
  113. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-db-backup.service +0 -0
  114. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-db-backup.sh +0 -0
  115. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-db-backup.timer +0 -0
  116. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-drive-queue.service +0 -0
  117. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-drive-queue.timer +0 -0
  118. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-failure-notify.service +0 -0
  119. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-fleet-watchdog.service +0 -0
  120. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  121. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-notify.service +0 -0
  122. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-notify.timer +0 -0
  123. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-release-propagate.service +0 -0
  124. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-release-propagate.timer +0 -0
  125. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-release-window.service +0 -0
  126. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-release-window.timer +0 -0
  127. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-serve.service +0 -0
  128. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-web-dist-build.service +0 -0
  129. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-web-dist-build.timer +0 -0
  130. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-web.service +0 -0
  131. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy_manifest.py +0 -0
  132. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy_units.py +0 -0
  133. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deps.py +0 -0
  134. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/diagnose.py +0 -0
  135. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dispatch.py +0 -0
  136. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dist_name.py +0 -0
  137. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/drive.py +0 -0
  138. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/drive_queue.py +0 -0
  139. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/drive_state.py +0 -0
  140. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/events.py +0 -0
  141. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/failure_class.py +0 -0
  142. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/filelock.py +0 -0
  143. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/fleet_config_health.py +0 -0
  144. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/forge_availability.py +0 -0
  145. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/freshness.py +0 -0
  146. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/gate_a.py +0 -0
  147. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/gate_b.py +0 -0
  148. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/gate_snapshot.py +0 -0
  149. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/gates.py +0 -0
  150. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/github_ops.py +0 -0
  151. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/github_throttle.py +0 -0
  152. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/goal.py +0 -0
  153. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/graph_health.py +0 -0
  154. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/__init__.py +0 -0
  155. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/aggregate.py +0 -0
  156. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/__init__.py +0 -0
  157. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/agent_install.py +0 -0
  158. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/cargo_targets.py +0 -0
  159. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/claude_binary.py +0 -0
  160. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/coord_web_ci_pin.py +0 -0
  161. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/deploy_lane_facts.py +0 -0
  162. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/disk.py +0 -0
  163. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/fleet_board.py +0 -0
  164. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  165. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/fleet_phantom.py +0 -0
  166. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/fleet_unit_drift.py +0 -0
  167. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/graph.py +0 -0
  168. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/graphify_cli.py +0 -0
  169. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/index_lock.py +0 -0
  170. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/issues_sync_staleness.py +0 -0
  171. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/plan_usage.py +0 -0
  172. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/release_cordon.py +0 -0
  173. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/repo_state.py +0 -0
  174. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/spawned_coord.py +0 -0
  175. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/stalled_pipeline.py +0 -0
  176. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/timer_active.py +0 -0
  177. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/toolchain.py +0 -0
  178. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/unit_drift.py +0 -0
  179. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/unit_enablement.py +0 -0
  180. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/worktrees.py +0 -0
  181. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/cli.py +0 -0
  182. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/context.py +0 -0
  183. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/fleet_snapshot.py +0 -0
  184. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/models.py +0 -0
  185. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/pypi.py +0 -0
  186. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/registry.py +0 -0
  187. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/render.py +0 -0
  188. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/units.py +0 -0
  189. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/hooks.py +0 -0
  190. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/housekeeping.py +0 -0
  191. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/interactive.py +0 -0
  192. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/issue_store.py +0 -0
  193. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/issues_sync_status.py +0 -0
  194. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/liveness_auditor.py +0 -0
  195. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/machine_onboard.py +0 -0
  196. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/machine_pause.py +0 -0
  197. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/merge_queue.py +0 -0
  198. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/milestone_chat.py +0 -0
  199. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/milestone_dispatch.py +0 -0
  200. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/milestone_gate.py +0 -0
  201. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/milestone_order.py +0 -0
  202. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/mock_author.py +0 -0
  203. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/models.py +0 -0
  204. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/network.py +0 -0
  205. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/new_issue_chat.py +0 -0
  206. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/__init__.py +0 -0
  207. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/baseline.py +0 -0
  208. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/cli.py +0 -0
  209. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/collect.py +0 -0
  210. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/digest.py +0 -0
  211. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/models.py +0 -0
  212. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/predicate.py +0 -0
  213. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/service.py +0 -0
  214. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/store.py +0 -0
  215. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/transport.py +0 -0
  216. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notify.py +0 -0
  217. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/openapi.py +0 -0
  218. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/overlap_fence.py +0 -0
  219. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/overlap_predict.py +0 -0
  220. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/parentage.py +0 -0
  221. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/parentage_github.py +0 -0
  222. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/pipeline.py +0 -0
  223. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/plan_parser.py +0 -0
  224. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/plans.py +0 -0
  225. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/platform_paths.py +0 -0
  226. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/portal_bridge.py +0 -0
  227. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/portal_sync.py +0 -0
  228. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/pr_body_lint.py +0 -0
  229. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/prereqs.py +0 -0
  230. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/progress.py +0 -0
  231. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/providers/__init__.py +0 -0
  232. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/providers/base.py +0 -0
  233. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/providers/claude.py +0 -0
  234. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/providers/claude_pty.py +0 -0
  235. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/providers/opencode.py +0 -0
  236. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/queue_diagnose.py +0 -0
  237. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/reconcile.py +0 -0
  238. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/reconcile_tick.py +0 -0
  239. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/refine_chat.py +0 -0
  240. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/release_cordon.py +0 -0
  241. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/release_propagate.py +0 -0
  242. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/release_verify.py +0 -0
  243. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/release_window.py +0 -0
  244. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/repo_edit.py +0 -0
  245. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/repo_onboard.py +0 -0
  246. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/reports.py +0 -0
  247. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/rest_schema.py +0 -0
  248. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/revalidate.py +0 -0
  249. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/review.py +0 -0
  250. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/scorecard.py +0 -0
  251. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/self_health.py +0 -0
  252. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  253. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  254. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  255. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  256. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  257. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/portal-followup/SKILL.md +0 -0
  258. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/release-now/SKILL.md +0 -0
  259. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  260. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  261. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/update-issue/SKILL.md +0 -0
  262. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/smoke.py +0 -0
  263. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/spend_ceiling.py +0 -0
  264. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/split_work.py +0 -0
  265. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/sql.py +0 -0
  266. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/stage_projection.py +0 -0
  267. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/state.py +0 -0
  268. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/store_migrate.py +0 -0
  269. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/test_author.py +0 -0
  270. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/test_chat.py +0 -0
  271. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/test_orchestrator.py +0 -0
  272. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/test_report.py +0 -0
  273. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/tui_release.py +0 -0
  274. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/usage.py +0 -0
  275. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/usage_limits.py +0 -0
  276. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/usage_rollup.py +0 -0
  277. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/worker_events.py +0 -0
  278. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coordinator.example.yml +0 -0
  279. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-agent.service +0 -0
  280. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-db-backup.service +0 -0
  281. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-db-backup.sh +0 -0
  282. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-db-backup.timer +0 -0
  283. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-drive-queue.service +0 -0
  284. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-drive-queue.timer +0 -0
  285. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-failure-notify.service +0 -0
  286. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-failure-notify.sh +0 -0
  287. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-fleet-watchdog.service +0 -0
  288. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-fleet-watchdog.timer +0 -0
  289. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-notify.service +0 -0
  290. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-notify.timer +0 -0
  291. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-release-propagate.service +0 -0
  292. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-release-propagate.timer +0 -0
  293. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-release-window.service +0 -0
  294. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-release-window.timer +0 -0
  295. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-serve.service +0 -0
  296. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-web-dist-build.service +0 -0
  297. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-web-dist-build.sh +0 -0
  298. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-web-dist-build.timer +0 -0
  299. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-web-rollback.sh +0 -0
  300. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-web.service +0 -0
  301. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/node-shim.sh +0 -0
  302. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  303. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ADR_COORD_WEB_CI.md +0 -0
  304. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ADR_COORD_WEB_DIST.md +0 -0
  305. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/AGENT_OPERATIONS.md +0 -0
  306. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ARCHITECTURE.md +0 -0
  307. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ARCH_SECURITY_GATES.md +0 -0
  308. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/COCKPIT.md +0 -0
  309. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/CONTROL_CENTER.md +0 -0
  310. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/COST_DISCIPLINE.md +0 -0
  311. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/CROSS_PLATFORM.md +0 -0
  312. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/CUSTOMER_FACING_APPS.md +0 -0
  313. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/CUSTOMER_PORTAL.md +0 -0
  314. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/DRIVE_QUEUE.md +0 -0
  315. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/EPHEMERAL_WORKERS.md +0 -0
  316. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/FORGE_MIGRATION.md +0 -0
  317. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/GRAPHIFY_SETUP.md +0 -0
  318. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ISSUE_GUIDANCE.md +0 -0
  319. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/MAC_MINI.md +0 -0
  320. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  321. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/NOTIFIER.md +0 -0
  322. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/OPENCODE_VERIFICATION.md +0 -0
  323. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/OPERATING_GOTCHAS.md +0 -0
  324. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/OPERATOR_GUIDES.md +0 -0
  325. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ORACLE_LOOP.md +0 -0
  326. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/PHONE_WEBAPP.md +0 -0
  327. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/PIPELINE_V2.md +0 -0
  328. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/PLATFORM_EVOLUTION.md +0 -0
  329. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/SECOND_BACKEND.md +0 -0
  330. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/STORE_SERVICE.md +0 -0
  331. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  332. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/WEB_CONTROL_CENTER.md +0 -0
  333. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/WSL_WINDOWS_WORKER.md +0 -0
  334. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/mocks/web/README.md +0 -0
  335. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/mocks/web/_tokens.css +0 -0
  336. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/mocks/web/issue-detail.html +0 -0
  337. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/mocks/web/pipeline-narrow.html +0 -0
  338. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/mocks/web/pipeline-wide.html +0 -0
  339. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/graphify-out/.gitignore +0 -0
  340. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/install-agent.sh +0 -0
  341. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/pyproject.toml +0 -0
  342. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/audit_review_verdict_overrides.py +0 -0
  343. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  344. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/build-worker-image.sh +0 -0
  345. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/coordinator-machine.py +0 -0
  346. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/epic-down.sh +0 -0
  347. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/epic-up.sh +0 -0
  348. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/preflight.sh +0 -0
  349. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/provision-worker.sh +0 -0
  350. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  351. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  352. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/verify-github-token.sh +0 -0
  353. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/check_gh_argv_containment.py +0 -0
  354. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/codegen.py +0 -0
  355. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/coord-test-runner.sh +0 -0
  356. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/coord-venv-rollback.sh +0 -0
  357. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/drive-batch.sh +0 -0
  358. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/fleet_watchdog.py +0 -0
  359. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/gen_board_fixture.py +0 -0
  360. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/gen_mock_index.py +0 -0
  361. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/next_release_tag.py +0 -0
  362. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/run_tests_in_populated_home.sh +0 -0
  363. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/run_tests_without_gh.sh +0 -0
  364. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/smoke_437_interactive.py +0 -0
  365. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/verify_878_review_capture.py +0 -0
  366. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/verify_release_published.py +0 -0
  367. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/verify_release_wheel.py +0 -0
  368. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/setup.cfg +0 -0
  369. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/SMOKE_SET.md +0 -0
  370. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/__init__.py +0 -0
  371. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-37/conftest.py +0 -0
  372. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-37/contract.md +0 -0
  373. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-37/manifest.yml +0 -0
  374. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  375. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  376. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/contract.md +0 -0
  377. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  378. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  379. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/manifest.yml +0 -0
  380. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  381. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/tsconfig.json +0 -0
  382. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  383. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/backends.py +0 -0
  384. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/conftest.py +0 -0
  385. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/board-pipeline-basic.json +0 -0
  386. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  387. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  388. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  389. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  390. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/all_pass.json +0 -0
  391. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  392. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/mixed_fail.json +0 -0
  393. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  394. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  395. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/skip.json +0 -0
  396. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/truncated.json +0 -0
  397. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  398. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  399. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  400. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  401. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  402. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  403. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  404. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  405. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_acceptance.py +0 -0
  406. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_acceptance_drivers.py +0 -0
  407. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent.py +0 -0
  408. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_api_error.py +0 -0
  409. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_app.py +0 -0
  410. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_branch_base.py +0 -0
  411. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_branch_capture.py +0 -0
  412. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_config_free_1712.py +0 -0
  413. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_deploy_units_endpoint.py +0 -0
  414. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_dirty_worktree.py +0 -0
  415. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  416. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_graph_self_heal.py +0 -0
  417. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_health_h3.py +0 -0
  418. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_idle_restart.py +0 -0
  419. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_push_failure.py +0 -0
  420. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_reap.py +0 -0
  421. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_repos_and_pull.py +0 -0
  422. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_restart_services_endpoint.py +0 -0
  423. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_skills_self_heal.py +0 -0
  424. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_startup_diagnostics.py +0 -0
  425. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_update.py +0 -0
  426. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_update_bluegreen.py +0 -0
  427. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_usage_limit.py +0 -0
  428. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_zero_commit.py +0 -0
  429. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ambient_home_isolation.py +0 -0
  430. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_approve_dependency_busy_2804.py +0 -0
  431. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_approve_reject_plan.py +0 -0
  432. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_approve_usage_gate.py +0 -0
  433. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_approved_work_2532.py +0 -0
  434. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_assignment_already_recorded_daemon.py +0 -0
  435. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_audit_log.py +0 -0
  436. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_audit_outcome.py +0 -0
  437. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_audit_query.py +0 -0
  438. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_auto_loop.py +0 -0
  439. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_auto_release_publish_2035.py +0 -0
  440. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_backend_selection.py +0 -0
  441. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_base_checkout_restore.py +0 -0
  442. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_block_log.py +0 -0
  443. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_cap_762.py +0 -0
  444. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_fixture.py +0 -0
  445. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_read_path.py +0 -0
  446. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_schema.py +0 -0
  447. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_service.py +0 -0
  448. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_state.py +0 -0
  449. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_wire.py +0 -0
  450. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_brain.py +0 -0
  451. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_branch_model.py +0 -0
  452. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_bug_intake.py +0 -0
  453. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_build_worker_image_env_update.py +0 -0
  454. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cargo_cache.py +0 -0
  455. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_check_gh_argv_containment.py +0 -0
  456. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ci_acceptance_gate_1950.py +0 -0
  457. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ci_fix.py +0 -0
  458. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ci_gitlab.py +0 -0
  459. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ci_parity_2091.py +0 -0
  460. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ci_store.py +0 -0
  461. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_claim.py +0 -0
  462. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_claude_md_budget.py +0 -0
  463. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_acceptance.py +0 -0
  464. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_assign.py +0 -0
  465. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  466. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_assign_interactive_remote.py +0 -0
  467. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_assign_provider.py +0 -0
  468. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  469. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_audit.py +0 -0
  470. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_chat_continue.py +0 -0
  471. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_decide.py +0 -0
  472. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_diagnose_config_provenance.py +0 -0
  473. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_diagnose_forge_availability.py +0 -0
  474. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_diagnose_graph.py +0 -0
  475. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_diagnose_self.py +0 -0
  476. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_doctor.py +0 -0
  477. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_doctor_config_free_1801.py +0 -0
  478. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  479. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_drive.py +0 -0
  480. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_drive_queue.py +0 -0
  481. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_escalate.py +0 -0
  482. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_fix_headless_review.py +0 -0
  483. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_gate_a.py +0 -0
  484. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_install_drift.py +0 -0
  485. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_install_skills.py +0 -0
  486. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_issue_comment.py +0 -0
  487. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_issue_create_label.py +0 -0
  488. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_issue_reopen.py +0 -0
  489. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_issue_view_list.py +0 -0
  490. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_merge.py +0 -0
  491. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_assign.py +0 -0
  492. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_capture.py +0 -0
  493. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_chat_add_child.py +0 -0
  494. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_dispatch.py +0 -0
  495. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_gate_b.py +0 -0
  496. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_gate_c.py +0 -0
  497. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_order.py +0 -0
  498. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  499. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_ship.py +0 -0
  500. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_network.py +0 -0
  501. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_new_issue_chat.py +0 -0
  502. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_plans.py +0 -0
  503. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_pr.py +0 -0
  504. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_pull_artifact.py +0 -0
  505. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_queue.py +0 -0
  506. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_reattach_sessions.py +0 -0
  507. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_refine_board.py +0 -0
  508. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_release_preflight.py +0 -0
  509. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_release_propagate.py +0 -0
  510. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_release_window.py +0 -0
  511. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_repo_2220.py +0 -0
  512. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  513. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_scorecard.py +0 -0
  514. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_set_review_findings.py +0 -0
  515. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_advisory_terminal.py +0 -0
  516. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_contested_tag.py +0 -0
  517. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_merge_queue.py +0 -0
  518. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_provider.py +0 -0
  519. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_review_finalizing.py +0 -0
  520. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_test_failed_tag.py +0 -0
  521. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_usage_limit.py +0 -0
  522. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_sync_comments_873.py +0 -0
  523. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_test_plan.py +0 -0
  524. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_track.py +0 -0
  525. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_tui_update.py +0 -0
  526. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_wait.py +0 -0
  527. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_client_base_install.py +0 -0
  528. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_commands_common.py +0 -0
  529. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_comments.py +0 -0
  530. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_completion_summary.py +0 -0
  531. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config.py +0 -0
  532. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config_acceptance.py +0 -0
  533. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config_audit.py +0 -0
  534. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config_pricing.py +0 -0
  535. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  536. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config_usage_gate.py +0 -0
  537. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_confirm_test.py +0 -0
  538. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_conflict_fix.py +0 -0
  539. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_conflict_fix_semantic.py +0 -0
  540. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  541. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_test.py +0 -0
  542. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_test_runner_baseline.py +0 -0
  543. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_test_runner_populated_home.py +0 -0
  544. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_test_runner_routing.py +0 -0
  545. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_test_runner_toolchain.py +0 -0
  546. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_uat.py +0 -0
  547. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_web_sse_restart_live.py +0 -0
  548. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coordinator_machine.py +0 -0
  549. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cross_platform_imports.py +0 -0
  550. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dao.py +0 -0
  551. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dashboard.py +0 -0
  552. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dashboard_fixture.py +0 -0
  553. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dashboard_terminal.py +0 -0
  554. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dashboard_terminal_live.py +0 -0
  555. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_db.py +0 -0
  556. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dead_end.py +0 -0
  557. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_coord_db_backup.py +0 -0
  558. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_coord_web_dist.py +0 -0
  559. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_coord_web_rollback.py +0 -0
  560. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_drive_queue_unit.py +0 -0
  561. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_failure_notify_unit.py +0 -0
  562. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_manifest.py +0 -0
  563. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_notify_unit.py +0 -0
  564. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_units_lane.py +0 -0
  565. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_web_unit.py +0 -0
  566. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deps.py +0 -0
  567. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_diagnose.py +0 -0
  568. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dispatch.py +0 -0
  569. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dispatch_target_validation.py +0 -0
  570. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dist_name.py +0 -0
  571. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_done_housekeeping.py +0 -0
  572. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive.py +0 -0
  573. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue.py +0 -0
  574. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue_blocked_rendering.py +0 -0
  575. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue_launch_argv.py +0 -0
  576. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  577. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue_roll_pending.py +0 -0
  578. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  579. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_state.py +0 -0
  580. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_tmux.py +0 -0
  581. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_epic_up_capability_detection.py +0 -0
  582. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  583. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_epic_up_image_provenance.py +0 -0
  584. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_errors.py +0 -0
  585. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_events.py +0 -0
  586. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_failure_class.py +0 -0
  587. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_filelock.py +0 -0
  588. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  589. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_fix_of_force_override.py +0 -0
  590. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_fleet_config_health.py +0 -0
  591. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_fleet_health_probes.py +0 -0
  592. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_fleet_health_snapshot.py +0 -0
  593. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_fleet_watchdog.py +0 -0
  594. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_forge_availability.py +0 -0
  595. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_freshness.py +0 -0
  596. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gate_a.py +0 -0
  597. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gate_b.py +0 -0
  598. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gate_snapshot_staleness.py +0 -0
  599. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gates.py +0 -0
  600. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  601. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gen_mock_index.py +0 -0
  602. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_generated_rust_fixture.py +0 -0
  603. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_generated_types_fixture.py +0 -0
  604. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_github_ops.py +0 -0
  605. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_github_throttle.py +0 -0
  606. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_goal.py +0 -0
  607. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_graph_health.py +0 -0
  608. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_graph_selfheal_absent_2237.py +0 -0
  609. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_handoff.py +0 -0
  610. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_checks.py +0 -0
  611. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_cli.py +0 -0
  612. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_cli_graph.py +0 -0
  613. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_config.py +0 -0
  614. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_context.py +0 -0
  615. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_coord_web_ci_pin.py +0 -0
  616. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_deploy_lane_facts.py +0 -0
  617. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_fix.py +0 -0
  618. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_incident_regression.py +0 -0
  619. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_issues_sync_staleness.py +0 -0
  620. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_pypi.py +0 -0
  621. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_registry.py +0 -0
  622. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_release_cordon_probe.py +0 -0
  623. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_timer_active.py +0 -0
  624. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_toolchain.py +0 -0
  625. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_unit_drift.py +0 -0
  626. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_unit_enablement.py +0 -0
  627. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_hooks.py +0 -0
  628. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_human_attended_437.py +0 -0
  629. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_init.py +0 -0
  630. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_install_agent_venv_2911.py +0 -0
  631. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_integration.py +0 -0
  632. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_briefing_echo.py +0 -0
  633. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_pane_log_2541.py +0 -0
  634. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_prefill_state.py +0 -0
  635. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_session_relaunch.py +0 -0
  636. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_test_verdict_backstop.py +0 -0
  637. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_token_attribution.py +0 -0
  638. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_worktree.py +0 -0
  639. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_issue_store_seam.py +0 -0
  640. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_issues_sync_status.py +0 -0
  641. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_liveness_auditor.py +0 -0
  642. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_liveness_notify.py +0 -0
  643. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_lock_contention_ratchet.py +0 -0
  644. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_machine_onboard.py +0 -0
  645. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_machine_pause.py +0 -0
  646. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_merge_queue.py +0 -0
  647. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_merge_verify.py +0 -0
  648. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_milestone_chat.py +0 -0
  649. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_milestone_dispatch.py +0 -0
  650. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_milestone_gate.py +0 -0
  651. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_milestone_order.py +0 -0
  652. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_milestone_seam.py +0 -0
  653. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_mock_author.py +0 -0
  654. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_model_tiering.py +0 -0
  655. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_models.py +0 -0
  656. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_models_config_labels.py +0 -0
  657. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_needs_attention.py +0 -0
  658. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_network.py +0 -0
  659. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_new_issue_chat.py +0 -0
  660. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_next_release_tag.py +0 -0
  661. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_node_shim.py +0 -0
  662. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_baseline.py +0 -0
  663. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_cli.py +0 -0
  664. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_collect.py +0 -0
  665. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_config.py +0 -0
  666. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_drive_seam.py +0 -0
  667. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_isolation.py +0 -0
  668. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_predicate.py +0 -0
  669. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_quiet_hours.py +0 -0
  670. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_service.py +0 -0
  671. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notify.py +0 -0
  672. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notify_drain.py +0 -0
  673. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_openapi.py +0 -0
  674. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_operational_defaults.py +0 -0
  675. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_overlap_fence.py +0 -0
  676. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_overlap_predict.py +0 -0
  677. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_packaged_deploy_units.py +0 -0
  678. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_parentage.py +0 -0
  679. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_paste_landed.py +0 -0
  680. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  681. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_pipeline.py +0 -0
  682. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_plan_followup_approve_plan_command.py +0 -0
  683. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_plan_followup_pr_command.py +0 -0
  684. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_plan_followup_review_command.py +0 -0
  685. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_plan_only.py +0 -0
  686. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_plan_parser.py +0 -0
  687. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_platform_paths.py +0 -0
  688. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_portal_bridge.py +0 -0
  689. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_portal_config.py +0 -0
  690. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_portal_sync.py +0 -0
  691. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_pr_body_lint.py +0 -0
  692. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_prereqs.py +0 -0
  693. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_production_db_guard.py +0 -0
  694. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_progress.py +0 -0
  695. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_provider_seam.py +0 -0
  696. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_providers.py +0 -0
  697. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_providers_config_labels.py +0 -0
  698. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_providers_pty.py +0 -0
  699. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_quiet_hours.py +0 -0
  700. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_quiet_hours_store_2146.py +0 -0
  701. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reap_merged_sessions.py +0 -0
  702. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reap_stale_interactive_tick.py +0 -0
  703. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile.py +0 -0
  704. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_branch.py +0 -0
  705. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_completions.py +0 -0
  706. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  707. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_merges.py +0 -0
  708. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_no_agent_record.py +0 -0
  709. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_tick.py +0 -0
  710. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_usage_limit_done.py +0 -0
  711. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_refine_chat.py +0 -0
  712. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_cordon_2101.py +0 -0
  713. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  714. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_cordon_deadlock_2240.py +0 -0
  715. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_cordon_stuck_2490.py +0 -0
  716. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_propagate.py +0 -0
  717. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_propagate_threshold.py +0 -0
  718. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_roll_between_legs_2854.py +0 -0
  719. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_roll_window_handoff.py +0 -0
  720. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_unified_1242.py +0 -0
  721. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_verify.py +0 -0
  722. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_window.py +0 -0
  723. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_remote_auto_prune.py +0 -0
  724. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_remote_interactive_reaper.py +0 -0
  725. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_repo_add.py +0 -0
  726. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_repo_edit_2220.py +0 -0
  727. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_repo_graph_fleet_2237.py +0 -0
  728. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_repo_onboard_2220.py +0 -0
  729. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_report_result_push.py +0 -0
  730. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reports.py +0 -0
  731. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_retry.py +0 -0
  732. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_retry_advisory_1606.py +0 -0
  733. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_retry_type_1636.py +0 -0
  734. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_revalidate.py +0 -0
  735. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review.py +0 -0
  736. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_end_review_without_verdict.py +0 -0
  737. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_parse_failure_diagnostic.py +0 -0
  738. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_reaffirm.py +0 -0
  739. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_state.py +0 -0
  740. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_verdict_backstop.py +0 -0
  741. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_verdict_override_audit.py +0 -0
  742. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_verdict_relay.py +0 -0
  743. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_zero_commits.py +0 -0
  744. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_scoped_review_wiring.py +0 -0
  745. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_scorecard.py +0 -0
  746. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_self_health.py +0 -0
  747. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_serve.py +0 -0
  748. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_serve_app_board_trim.py +0 -0
  749. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_serve_rest_routes.py +0 -0
  750. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_session.py +0 -0
  751. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_slice_issue_attribution.py +0 -0
  752. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_smoke.py +0 -0
  753. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_smoke_live_checkout_restore.py +0 -0
  754. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_smoke_workflow.py +0 -0
  755. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_spend_ceiling.py +0 -0
  756. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_spend_ceiling_coordinator.py +0 -0
  757. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_split.py +0 -0
  758. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_split_work.py +0 -0
  759. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_sql_dialect.py +0 -0
  760. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stage_projection.py +0 -0
  761. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stale_busy_reviewer_697.py +0 -0
  762. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stalled_pipeline.py +0 -0
  763. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_state.py +0 -0
  764. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_state_review_findings_daemon.py +0 -0
  765. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_status_fleet_footer.py +0 -0
  766. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stop_1567.py +0 -0
  767. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_store_contract.py +0 -0
  768. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_store_migrate.py +0 -0
  769. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stuck.py +0 -0
  770. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  771. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_terminal_command.py +0 -0
  772. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_author.py +0 -0
  773. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_chat.py +0 -0
  774. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_orchestrator.py +0 -0
  775. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_report.py +0 -0
  776. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_verdict_parsing.py +0 -0
  777. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_verdict_transcript_floor.py +0 -0
  778. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_text_io_encoding_audit.py +0 -0
  779. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_thin_client_board_audit.py +0 -0
  780. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_thin_client_config_load_1080.py +0 -0
  781. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_thin_client_daemon_routing_906.py +0 -0
  782. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_tmux_host.py +0 -0
  783. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_tmux_session.py +0 -0
  784. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_transcript_floor.py +0 -0
  785. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_usage.py +0 -0
  786. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_usage_limits.py +0 -0
  787. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_usage_rollup.py +0 -0
  788. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_venv_live_install_2121.py +0 -0
  789. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_version_single_source.py +0 -0
  790. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_watch.py +0 -0
  791. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  792. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worker_env_venv_isolation.py +0 -0
  793. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worker_events.py +0 -0
  794. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worker_image_pin_sync.py +0 -0
  795. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worker_safety.py +0 -0
  796. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worker_test_scoping.py +0 -0
  797. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worktree.py +0 -0
  798. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  799. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_write_parity.py +0 -0
  800. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/write_parity.py +0 -0
  801. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/.github/workflows/release-tui.yml +0 -0
  802. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/Cargo.lock +0 -0
  803. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/Cargo.toml +0 -0
  804. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/cargo-config-local-quadraui.toml.example +0 -0
  805. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/approved.rs +0 -0
  806. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/audit.rs +0 -0
  807. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/chat.rs +0 -0
  808. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/data.rs +0 -0
  809. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/dialogs.rs +0 -0
  810. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/doc_tabs.rs +0 -0
  811. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/drive.rs +0 -0
  812. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/drive_queue.rs +0 -0
  813. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/escalation.rs +0 -0
  814. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/events.rs +0 -0
  815. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/fixtures.rs +0 -0
  816. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/fleet_health.rs +0 -0
  817. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/fleet_sessions.rs +0 -0
  818. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/fleet_terminals.rs +0 -0
  819. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/format.rs +0 -0
  820. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/milestone_dag.rs +0 -0
  821. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/mod.rs +0 -0
  822. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/msv.rs +0 -0
  823. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/pipeline.rs +0 -0
  824. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/plans.rs +0 -0
  825. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/render.rs +0 -0
  826. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/reports.rs +0 -0
  827. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/sessions.rs +0 -0
  828. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/settings_ui.rs +0 -0
  829. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/sidebar.rs +0 -0
  830. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/terminal.rs +0 -0
  831. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/tests.rs +0 -0
  832. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/types/generated.rs +0 -0
  833. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/types.rs +0 -0
  834. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/workspace.rs +0 -0
  835. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/bin/gtk.rs +0 -0
  836. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/commands.rs +0 -0
  837. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/lib.rs +0 -0
  838. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/main.rs +0 -0
  839. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/settings.rs +0 -0
  840. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
  841. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/contract.md +0 -0
  842. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
  843. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  844. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  845. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  846. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  847. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/contract.md +0 -0
  848. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
  849. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  850. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  851. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  852. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  853. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  854. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  855. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  856. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  857. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  858. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  859. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  860. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  861. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  862. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/contract.md +0 -0
  863. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  864. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
  865. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  866. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  867. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  868. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  869. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  870. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  871. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  872. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  873. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  874. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  875. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  876. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  877. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/contract.md +0 -0
  878. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  879. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
  880. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  881. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  882. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  883. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  884. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  885. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  886. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance.rs +0 -0
  887. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/cli.rs +0 -0
  888. {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.289
3
+ Version: 0.5.290
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.289
3
+ Version: 0.5.290
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.289",
2
+ "tag": "0.5.290",
3
3
  "distance": 0,
4
- "node": "ga013df1e45f8ba2ece0ba26be923f8a107dbe654",
4
+ "node": "gd9ef2036c79e6b93ba2c92ee4c1a1756d509370f",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-29"
@@ -4139,6 +4139,82 @@ and report back what you asked/proposed/filed/queued/linked (and any gap) \
4139
4139
  when done.\
4140
4140
  """
4141
4141
 
4142
+ # #2867: the ATTENDED posture. Appended to (never merged into)
4143
+ # DECOMPOSITION_CHAT_SYSTEM_PROMPT by `coord portal decompose-chat
4144
+ # --interactive` only — the headless dispatch
4145
+ # (`default_worker_command`'s `spec.type == "decomposition-chat"` branch)
4146
+ # must keep receiving the base prompt byte-for-byte, because it genuinely
4147
+ # has nobody to ask and its one-turn fire-and-forget shape is correct there.
4148
+ #
4149
+ # WHY this exists at all: #2750 shipped `--interactive` reusing the headless
4150
+ # prompt verbatim, so the attended session was written for an agent with
4151
+ # nobody to ask ("THIS iteration ends in EXACTLY ONE of three terminal
4152
+ # moves", each a command to run) and duly read the ledger, chose ASK, and
4153
+ # ran `enqueue-question` in the SAME turn — its whole output to the human
4154
+ # sitting there was a report of what it had already done. On a paid client
4155
+ # engagement where a round-trip takes days, that spent a day on questions
4156
+ # the operator may already have had answers to. The base prompt's
4157
+ # "summarize your plan before writing anything" was not enough: nothing
4158
+ # made it a STOP, and without a turn boundary a compliant session still
4159
+ # writes.
4160
+ DECOMPOSITION_CHAT_ATTENDED_ADDENDUM = """\
4161
+
4162
+ ── ATTENDED SESSION (`--interactive`) — OVERRIDES THE ABOVE ──
4163
+
4164
+ An operator is sitting at this terminal RIGHT NOW, watching you type. That \
4165
+ changes the shape of this iteration, and where this section conflicts with \
4166
+ anything above, THIS SECTION WINS.
4167
+
4168
+ **YOUR FIRST TURN WRITES NOTHING.** Not `coord portal enqueue-question`, not \
4169
+ `coord portal enqueue-status`, not `coord portal decision propose/reject/\
4170
+ supersede`, not `coord issue create`, not `coord milestone create`, not \
4171
+ `coord drive-queue add`, not `coord portal link`, not `coord issue edit`. \
4172
+ Read-only commands (`coord portal ledger`, `gh issue view`, reading files) \
4173
+ are fine and expected. The "EXACTLY ONE of three terminal moves" rule above \
4174
+ still decides WHICH exit this iteration takes — it just does not get to \
4175
+ happen until the operator has answered you.
4176
+
4177
+ So your first turn is:
4178
+
4179
+ 1. State your READ — the MODE line verbatim (as always), then what RUNNING \
4180
+ CONTEXT already tells you, explicitly including any operator-supplied \
4181
+ background recorded there.
4182
+ 2. State your PROPOSED EXIT — which of Ask / Propose / Decompose you intend, \
4183
+ the exact command(s) you would run (question text, decision text, issue \
4184
+ titles), and WHY that exit and not the other two.
4185
+ 3. State what you are ASSUMING or MISSING — above all, anything you were \
4186
+ about to ask the CLIENT that the OPERATOR may simply know. The operator may \
4187
+ have spoken to the client since the last iteration; a client round-trip \
4188
+ costs days and an operator answer costs one line, so ask the human in front \
4189
+ of you FIRST.
4190
+ 4. END YOUR TURN AND WAIT. Do not narrate a plan and then execute it in the \
4191
+ same turn — the turn boundary IS the confirmation.
4192
+
4193
+ Then act on what the operator says: carry out the exit as proposed, or the \
4194
+ revised one they steer you to. If they confirm with no changes, run the \
4195
+ commands exactly as you stated them and report back. If they redirect you \
4196
+ into a different exit, take that one — it is still exactly one terminal \
4197
+ move per iteration.
4198
+
4199
+ **Recording what the operator tells you.** Background the operator relays \
4200
+ ("I spoke to her — it's just the two of them, and the calendar is a \
4201
+ nice-to-have") is durable, ledger-class context that every FUTURE session on \
4202
+ every machine should see. It is not a decision, so do NOT push it through \
4203
+ `coord portal decision propose`. Record it verbatim with:
4204
+
4205
+ coord portal note <submission_id> "<what the operator told you>"
4206
+
4207
+ This is an ADDITIONAL write path you are permitted, on top of the ones the \
4208
+ Rules section above enumerates — and, being a write, it is also subject to \
4209
+ the first-turn rule: offer it, then record it once the operator agrees. \
4210
+ OFFER IT PROACTIVELY: the operator should not have to know this command \
4211
+ exists. Any time the operator gives you a substantive fact about the \
4212
+ client, the users, or the scope, say back what you would record and ask \
4213
+ whether to record it. Keep the wording theirs, not your paraphrase — the \
4214
+ ledger is verbatim by design, and the narrative (which is regenerable) is \
4215
+ where summarizing belongs.\
4216
+ """
4217
+
4142
4218
  # Deny list applied to decomposition-chat workers (#2533; extended #2750
4143
4219
  # IL-4 for the ask/propose/decompose intake loop). Unlike milestone-chat,
4144
4220
  # this type's WHOLE job is to write (issue create / issue edit / milestone
@@ -596,6 +596,7 @@ def _run_decompose_chat_interactive(
596
596
 
597
597
  from coord.agent import ( # noqa: PLC0415
598
598
  AssignmentSpec as _AssignmentSpecDc,
599
+ DECOMPOSITION_CHAT_ATTENDED_ADDENDUM,
599
600
  DECOMPOSITION_CHAT_DENY_COMMANDS,
600
601
  DECOMPOSITION_CHAT_SYSTEM_PROMPT,
601
602
  build_deny_prompt,
@@ -664,7 +665,8 @@ def _run_decompose_chat_interactive(
664
665
  if _board_service.resolve() is not None:
665
666
  click.secho(
666
667
  "note: this machine is a thin client — `coord portal decision`/"
667
- "`ledger`/`link` route through the daemon (#2751), but `coord "
668
+ "`ledger`/`link`/`note` route through the daemon (#2751/#2867), "
669
+ "but `coord "
668
670
  "portal enqueue-question`/`enqueue-status` (the Ask move) do "
669
671
  "not yet and will refuse loudly if this iteration needs them. "
670
672
  "ssh to the daemon host for that case (#2750's own stated "
@@ -699,7 +701,9 @@ def _run_decompose_chat_interactive(
699
701
  f"Intake session for portal submission {submission_id} "
700
702
  f"(MODE: {mode_word} — {discuss_reason}): read the full context at "
701
703
  f"{brief_path} (submission fields, repo topology, and the running-"
702
- "context ledger so far) and let's work through it."
704
+ "context ledger so far) and let's work through it. This is an "
705
+ "ATTENDED session: state your read and your PROPOSED exit, then stop "
706
+ "and wait for me — write nothing until I answer (#2867)."
703
707
  )
704
708
 
705
709
  spec = _AssignmentSpecDc(
@@ -719,15 +723,22 @@ def _run_decompose_chat_interactive(
719
723
  # internal branch table has no `"decomposition-chat"` case, so leaving
720
724
  # it implicit would silently fall through to the generic work-shaped
721
725
  # branch (full WORKER_SYSTEM_PROMPT + Edit/Write/Monitor), which is
722
- # wrong for a no-worktree chat type. Passing these explicitly keeps
723
- # this session byte-identical, on the system prompt, to the headless
724
- # dispatch path (`coord.agent.default_worker_command`'s own
725
- # `spec.type == "decomposition-chat"` branch).
726
+ # wrong for a no-worktree chat type.
727
+ #
728
+ # #2867: the attended addendum is appended HERE and only here — the
729
+ # headless dispatch path (`coord.agent.default_worker_command`'s own
730
+ # `spec.type == "decomposition-chat"` branch) keeps the base prompt
731
+ # byte-for-byte, so its one-turn fire-and-forget behaviour is unchanged.
732
+ # This session, by contrast, has a human in the pane: the addendum makes
733
+ # its first turn confirm-then-write (#2742's absorbed half, which #2750
734
+ # only ever wired into mode SELECTION, never into the posture itself).
726
735
  argv = provider.build_command(
727
736
  spec,
728
737
  resolved_model=resolved_model,
729
- system_prompt=DECOMPOSITION_CHAT_SYSTEM_PROMPT + build_deny_prompt(
730
- DECOMPOSITION_CHAT_DENY_COMMANDS
738
+ system_prompt=(
739
+ DECOMPOSITION_CHAT_SYSTEM_PROMPT
740
+ + DECOMPOSITION_CHAT_ATTENDED_ADDENDUM
741
+ + build_deny_prompt(DECOMPOSITION_CHAT_DENY_COMMANDS)
731
742
  ),
732
743
  allowed_tools="Read,Bash",
733
744
  )
@@ -1805,6 +1816,16 @@ def _render_ledger_text(payload: dict) -> str:
1805
1816
  f"{a['text']} (by {a['actor'] or 'customer'})"
1806
1817
  )
1807
1818
 
1819
+ # #2867: verbatim, attributed, in ledger seq order — its own heading so
1820
+ # a later session can tell operator-relayed background from something
1821
+ # the client actually wrote on the portal. `.get` (not `[...]`) because
1822
+ # a thin client may be talking to a daemon that predates this key.
1823
+ notes = payload.get("operator_notes") or []
1824
+ if notes:
1825
+ lines += ["", "## Operator notes"]
1826
+ for n in notes:
1827
+ lines.append(f"- [{n['seq']}] {n['text']} (by {n['actor'] or 'operator'})")
1828
+
1808
1829
  lines += ["", "## Decisions"]
1809
1830
  current = payload["decisions"]
1810
1831
  if not current:
@@ -1861,6 +1882,39 @@ def portal_ledger(submission_id: str, as_json: bool) -> None:
1861
1882
  click.echo(_render_ledger_text(payload))
1862
1883
 
1863
1884
 
1885
+ @portal_group.command("note")
1886
+ @click.argument("submission_id")
1887
+ @click.argument("text")
1888
+ def portal_note(submission_id: str, text: str) -> None:
1889
+ """Record operator-supplied background about SUBMISSION_ID (#2867).
1890
+
1891
+ The ledger layer that holds what the OPERATOR knows — "spoke to the
1892
+ client: household of two, no logins needed" — which before this had
1893
+ nowhere durable to live and died with the tmux pane it was typed into.
1894
+ Stored verbatim on the ledger, attributed to you, and rendered into
1895
+ every future session's RUNNING CONTEXT on any machine.
1896
+
1897
+ Deliberately NOT `coord portal decision propose`: a relayed fact is not
1898
+ a judgment call, has no proposed/confirmed lifecycle, and does not
1899
+ belong in the decision archive.
1900
+
1901
+ Like `decision` and `link` (#2751) this is not thin-client-refused — it
1902
+ routes through the daemon's `/portal-note` seam when `board_service` is
1903
+ configured, so it works from wherever the operator happens to be.
1904
+ """
1905
+ from coord import portal_store # noqa: PLC0415
1906
+
1907
+ try:
1908
+ entry = portal_store.append_operator_note(submission_id, text, actor=_actor())
1909
+ except ValueError as exc:
1910
+ click.secho(f"error: {exc}", fg="red")
1911
+ raise SystemExit(2) from exc
1912
+ click.secho(
1913
+ f"noted: {submission_id} #{entry.seq} (by {entry.actor}) — {entry.text}",
1914
+ fg="green",
1915
+ )
1916
+
1917
+
1864
1918
  @portal_group.group("decision")
1865
1919
  def portal_decision_group() -> None:
1866
1920
  """Propose / confirm / reject / supersede a decision (#2749).
@@ -278,6 +278,11 @@ def render_running_context_section(payload: dict[str, Any]) -> str:
278
278
  ones carrying why), and the current narrative. This is what lets a
279
279
  fresh iteration pick up exactly where the last one left off with no
280
280
  memory of the prior session (#2750's "the loop").
281
+
282
+ Since #2867 it also renders the ledger's operator-note layer — what a
283
+ human relayed out of band ("I spoke to her; it's just the two of them")
284
+ — attributed as operator-supplied so a session can tell it from
285
+ something the client wrote on the portal itself.
281
286
  """
282
287
  lines: list[str] = ["RUNNING CONTEXT (from the portal ledger):", "", "Q&A so far:"]
283
288
  qa = payload.get("qa") or []
@@ -301,6 +306,22 @@ def render_running_context_section(payload: dict[str, Any]) -> str:
301
306
  f"{a.get('text', '')} (by {a.get('actor') or 'customer'})"
302
307
  )
303
308
 
309
+ # #2867: verbatim and attributed, so a session on a different machine
310
+ # with no shared transcript still sees what the operator was told out of
311
+ # band. Placed ahead of decisions because it is INPUT to them.
312
+ notes = payload.get("operator_notes") or []
313
+ if notes:
314
+ lines.append("")
315
+ lines.append(
316
+ "Operator-supplied background (relayed by a human, NOT written by "
317
+ "the client on the portal — treat as fact, do not re-ask it):"
318
+ )
319
+ for n in notes:
320
+ lines.append(
321
+ f" - [{n.get('seq')}] {n.get('text')} "
322
+ f"(by {n.get('actor') or 'operator'})"
323
+ )
324
+
304
325
  lines.append("")
305
326
  lines.append("Current decisions (proposed/confirmed — treat as live guidance):")
306
327
  current = payload.get("decisions") or []
@@ -1739,6 +1739,44 @@ LEDGER_KIND_DRAFT_EDITED = "draft_edited"
1739
1739
  LEDGER_KIND_DRAFT_APPROVED = "draft_approved"
1740
1740
  LEDGER_KIND_DRAFT_REJECTED = "draft_rejected"
1741
1741
 
1742
+ #: #2867: background the OPERATOR relays — "I spoke to her; it's just the two
1743
+ #: of them and the calendar is a nice-to-have." Ledger-class, not
1744
+ #: decision-class: it is a FACT someone told the operator, not a judgment
1745
+ #: call with a proposed/confirmed lifecycle, so forcing it through
1746
+ #: `coord portal decision propose` would both lose the raw statement and
1747
+ #: pollute the decision archive. Still coord-observed in the sense this
1748
+ #: section's ownership note means — a human typed it at coord's own CLI,
1749
+ #: which is not "an agent's say-so about a fact it does not solely observe".
1750
+ #: Stored VERBATIM and never folded into the narrative (#2746: "a ledger that
1751
+ #: IS a narrative cannot be regenerated — that asymmetry is the design").
1752
+ LEDGER_KIND_OPERATOR_NOTE = "operator_note"
1753
+
1754
+ #: Marks a ledger ``actor`` as a human at coord's CLI rather than the portal
1755
+ #: wire, so a later session can tell operator-relayed context from something
1756
+ #: the client actually wrote. See :func:`operator_actor`.
1757
+ OPERATOR_ACTOR_PREFIX = "operator:"
1758
+
1759
+
1760
+ def operator_actor(name: str = "") -> str:
1761
+ """The ``actor`` string for an operator-authored ledger row.
1762
+
1763
+ ``"jane"`` → ``"operator:jane"``; empty → the bare ``"operator"``. Already
1764
+ prefixed values pass through unchanged, so routing a note through the
1765
+ daemon (which re-normalizes) can't produce ``operator:operator:jane``.
1766
+ """
1767
+ n = (name or "").strip()
1768
+ if not n:
1769
+ return "operator"
1770
+ return n if n.startswith(OPERATOR_ACTOR_PREFIX) else f"{OPERATOR_ACTOR_PREFIX}{n}"
1771
+
1772
+
1773
+ def is_operator_actor(actor: str) -> bool:
1774
+ """True when *actor* names a human at coord's CLI (:func:`operator_actor`'s
1775
+ output) rather than the customer or an agent — what the briefing renders
1776
+ attribute notes with."""
1777
+ a = (actor or "").strip()
1778
+ return a == "operator" or a.startswith(OPERATOR_ACTOR_PREFIX)
1779
+
1742
1780
 
1743
1781
  @dataclass(frozen=True)
1744
1782
  class LedgerEntry:
@@ -1870,6 +1908,79 @@ def ledger_for_submission(submission_id: str) -> list[LedgerEntry]:
1870
1908
  return [_ledger_from_row(r) for r in rows]
1871
1909
 
1872
1910
 
1911
+ def operator_notes_for_submission(submission_id: str) -> list[LedgerEntry]:
1912
+ """*submission_id*'s operator notes (#2867), oldest first — the ledger
1913
+ rows a human typed, filtered out of :func:`ledger_for_submission`'s full
1914
+ history by kind."""
1915
+ return [
1916
+ e
1917
+ for e in ledger_for_submission(submission_id)
1918
+ if e.kind == LEDGER_KIND_OPERATOR_NOTE
1919
+ ]
1920
+
1921
+
1922
+ def _append_operator_note_local(
1923
+ submission_id: str, text: str, *, actor: str = "", now: float | None = None
1924
+ ) -> LedgerEntry:
1925
+ """Write half of :func:`append_operator_note` — runs on the daemon host
1926
+ (either directly, or via ``/portal-note`` on behalf of a thin client).
1927
+
1928
+ Validates the submission EXISTS here rather than in the CLI: on a thin
1929
+ client the local ``portal_submissions`` table is empty by construction
1930
+ (#2336), so a caller-side check would reject every id. Doing it here
1931
+ means the "unknown submission" error is raised where the real table
1932
+ lives, whichever machine the operator typed the command on.
1933
+ """
1934
+ if not submission_id or not submission_id.strip():
1935
+ raise ValueError("operator note needs a submission_id")
1936
+ if not text or not text.strip():
1937
+ raise ValueError("operator note needs non-empty text")
1938
+ if get_submission(submission_id) is None:
1939
+ raise ValueError(
1940
+ f"unknown submission {submission_id!r} — no portal submission with "
1941
+ "that id (check `coord portal status` for the current ids)"
1942
+ )
1943
+ return append_ledger_entry(
1944
+ submission_id,
1945
+ LEDGER_KIND_OPERATOR_NOTE,
1946
+ text=text.strip(),
1947
+ actor=operator_actor(actor),
1948
+ now=now,
1949
+ )
1950
+
1951
+
1952
+ def _route_note(payload: dict[str, Any]) -> dict[str, Any] | None:
1953
+ """POST *payload* to the daemon's ``/portal-note`` seam, or ``None`` if
1954
+ this process IS the daemon host — the note-shaped twin of
1955
+ :func:`_route_decision`, and daemon-routed for exactly the same reason
1956
+ (#2751): the operator may be sitting at any machine in the fleet, and a
1957
+ note written into a thin client's own empty DB would be silently lost.
1958
+ """
1959
+ from coord import board_service # noqa: PLC0415
1960
+
1961
+ svc = board_service.resolve()
1962
+ return board_service.route_write(svc, "/portal-note", payload)
1963
+
1964
+
1965
+ def append_operator_note(
1966
+ submission_id: str, text: str, *, actor: str = "", now: float | None = None
1967
+ ) -> LedgerEntry:
1968
+ """Append one operator-supplied background fact to *submission_id*'s
1969
+ ledger (#2867) — routed to the daemon when ``board_service`` is
1970
+ configured, else written locally.
1971
+
1972
+ Raises :class:`ValueError` for an unknown submission, empty text, or a
1973
+ missing id. The stored text is VERBATIM (stripped of surrounding
1974
+ whitespace only) and is never rewritten into the narrative.
1975
+ """
1976
+ routed = _route_note(
1977
+ {"submission_id": submission_id, "text": text, "actor": actor}
1978
+ )
1979
+ if routed is not None:
1980
+ return _ledger_from_row(routed["entry"])
1981
+ return _append_operator_note_local(submission_id, text, actor=actor, now=now)
1982
+
1983
+
1873
1984
  # ── layer 2: decisions (agent-authored, operator-confirmed) ─────────────────
1874
1985
 
1875
1986
  DECISION_PROPOSED = "proposed"
@@ -2208,6 +2319,11 @@ def render_ledger_payload(submission_id: str) -> dict[str, Any]:
2208
2319
  :func:`coord.portal_sync._record_question_answer` never drops one just
2209
2320
  because it can't be paired) lands in ``unpaired_answers`` instead of
2210
2321
  being silently lost.
2322
+
2323
+ Operator notes (#2867) come back verbatim under their own
2324
+ ``operator_notes`` key, in ledger ``seq`` order — deliberately NOT mixed
2325
+ into ``qa`` (they answer no question) and NOT folded into ``narrative``
2326
+ (they are ledger-class facts, and the narrative is regenerable).
2211
2327
  """
2212
2328
  ledger = ledger_for_submission(submission_id)
2213
2329
  decisions = decisions_for_submission(submission_id)
@@ -2215,8 +2331,11 @@ def render_ledger_payload(submission_id: str) -> dict[str, Any]:
2215
2331
 
2216
2332
  questions: dict[int | None, dict[str, Any]] = {}
2217
2333
  unpaired_answers: list[LedgerEntry] = []
2334
+ operator_notes: list[LedgerEntry] = []
2218
2335
  for entry in ledger:
2219
- if entry.kind == LEDGER_KIND_QUESTION_PUSHED:
2336
+ if entry.kind == LEDGER_KIND_OPERATOR_NOTE:
2337
+ operator_notes.append(entry)
2338
+ elif entry.kind == LEDGER_KIND_QUESTION_PUSHED:
2220
2339
  questions.setdefault(
2221
2340
  entry.question_revision, {"question": entry, "answers": []}
2222
2341
  )
@@ -2252,6 +2371,19 @@ def render_ledger_payload(submission_id: str) -> dict[str, Any]:
2252
2371
  }
2253
2372
  for a in unpaired_answers
2254
2373
  ],
2374
+ # #2867: verbatim, in ledger `seq` order (`ledger_for_submission` is
2375
+ # seq-ordered and this list preserves that), carrying the operator
2376
+ # `actor` so every renderer can attribute them rather than letting
2377
+ # them read as something the client said.
2378
+ "operator_notes": [
2379
+ {
2380
+ "seq": n.seq,
2381
+ "text": n.text,
2382
+ "actor": n.actor,
2383
+ "recorded_at": n.recorded_at,
2384
+ }
2385
+ for n in operator_notes
2386
+ ],
2255
2387
  "decisions": [
2256
2388
  {
2257
2389
  "seq": d.seq,
@@ -3283,6 +3283,41 @@ def openapi_spec() -> dict:
3283
3283
  },
3284
3284
  },
3285
3285
  },
3286
+ "/portal-note": {
3287
+ "post": {
3288
+ "summary": (
3289
+ "#2867: append one operator-supplied background fact to a "
3290
+ "submission's ledger, verbatim — the layer that holds what "
3291
+ "the OPERATOR knows (e.g. relayed from a phone call). "
3292
+ "Executed HERE on the daemon, same reason /portal-decision "
3293
+ "is — `coord portal note`"
3294
+ ),
3295
+ "requestBody": {
3296
+ "required": True,
3297
+ "content": {
3298
+ "application/json": {
3299
+ "schema": {
3300
+ "type": "object",
3301
+ "properties": {
3302
+ "submission_id": {"type": "string"},
3303
+ "text": {"type": "string"},
3304
+ "actor": {"type": "string"},
3305
+ },
3306
+ "required": ["submission_id", "text"],
3307
+ }
3308
+ }
3309
+ },
3310
+ },
3311
+ "responses": {
3312
+ "200": {"description": "OK — {'entry': <serialized LedgerEntry>}"},
3313
+ "400": {
3314
+ "description": (
3315
+ "Missing submission_id, empty text, or unknown submission"
3316
+ )
3317
+ },
3318
+ },
3319
+ },
3320
+ },
3286
3321
  "/portal-ledger": {
3287
3322
  "get": {
3288
3323
  "summary": (
@@ -6191,6 +6226,60 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
6191
6226
  }
6192
6227
  )
6193
6228
 
6229
+ async def post_portal_note(request: Request) -> Response:
6230
+ # #2867: the ledger's operator-context layer. Same seam shape and
6231
+ # same rationale as `/portal-decision` right above (#2751) — the
6232
+ # operator relaying what a client told them may be sitting at any
6233
+ # machine in the fleet, and a note written into a thin client's own
6234
+ # empty `portal_ledger` would be silently lost. The unknown-
6235
+ # submission check lives in `_append_operator_note_local`, i.e. HERE
6236
+ # where the real `portal_submissions` table is, and surfaces as a
6237
+ # 400 through the same ValueError branch.
6238
+ import json as _json # noqa: PLC0415
6239
+
6240
+ from coord import portal_store # noqa: PLC0415
6241
+
6242
+ body = await _read_json(request)
6243
+ if body is None:
6244
+ return JSONResponse({"error": "invalid JSON body"}, status_code=400)
6245
+ submission_id = body.get("submission_id")
6246
+ if not isinstance(submission_id, str) or not submission_id:
6247
+ return JSONResponse(
6248
+ {"error": "portal-note needs a 'submission_id'"}, status_code=400
6249
+ )
6250
+ try:
6251
+ entry = portal_store._append_operator_note_local(
6252
+ submission_id,
6253
+ body.get("text") or "",
6254
+ actor=body.get("actor") or "",
6255
+ )
6256
+ except ValueError as e:
6257
+ return JSONResponse({"error": f"bad portal-note: {e}"}, status_code=400)
6258
+ except Exception as e: # noqa: BLE001
6259
+ return JSONResponse(
6260
+ {"error": "portal-note write failed", "detail": str(e)},
6261
+ status_code=503,
6262
+ )
6263
+ return JSONResponse(
6264
+ {
6265
+ "entry": {
6266
+ "id": entry.id,
6267
+ "submission_id": entry.submission_id,
6268
+ "seq": entry.seq,
6269
+ "kind": entry.kind,
6270
+ "question_revision": entry.question_revision,
6271
+ "text": entry.text,
6272
+ "actor": entry.actor,
6273
+ "source_event_id": entry.source_event_id,
6274
+ # `_ledger_from_row` (which the client feeds this dict
6275
+ # back into) parses this key as a JSON *string*, exactly
6276
+ # as it comes off a DB row — not as a nested object.
6277
+ "payload_json": _json.dumps(entry.payload, sort_keys=True),
6278
+ "recorded_at": entry.recorded_at,
6279
+ }
6280
+ }
6281
+ )
6282
+
6194
6283
  async def get_portal_ledger(request: Request) -> Response:
6195
6284
  # #2749 (IL-3): render one submission's running-context briefing on
6196
6285
  # the daemon and hand back the same JSON shape
@@ -9482,6 +9571,7 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
9482
9571
  Route("/portal-link", get_portal_link, methods=["GET"]),
9483
9572
  Route("/portal-link", post_portal_link, methods=["POST"]),
9484
9573
  Route("/portal-decision", post_portal_decision, methods=["POST"]),
9574
+ Route("/portal-note", post_portal_note, methods=["POST"]),
9485
9575
  Route("/portal-ledger", get_portal_ledger, methods=["GET"]),
9486
9576
  Route("/dispatched", post_dispatched, methods=["POST"]),
9487
9577
  Route("/test-verdict", post_test_verdict, methods=["POST"]),
@@ -1775,3 +1775,124 @@ def test_a_configured_ungated_kind_queues_straight_through(tmp_path, monkeypatch
1775
1775
 
1776
1776
  assert [r.seq for r in portal_store.pending_outbox()] == [1, 2]
1777
1777
  assert portal_store.draft_outbox() == []
1778
+
1779
+
1780
+ # ── #2867: `coord portal note` — the ledger's operator-context layer ─────────
1781
+
1782
+
1783
+ def test_note_is_registered_on_the_portal_group():
1784
+ result = run("portal", "--help")
1785
+ assert result.exit_code == 0
1786
+ assert "note" in result.output
1787
+
1788
+
1789
+ def test_note_records_operator_background_verbatim_and_attributed(monkeypatch):
1790
+ """The headline #2867 behaviour: what the operator knows gets a durable
1791
+ home on the ledger, stored exactly as typed and attributed to a human."""
1792
+ from coord import portal_store
1793
+
1794
+ portal_store.seed_revision("sub_1", 1)
1795
+ monkeypatch.setattr("coord.commands.portal._actor", lambda: "jane")
1796
+
1797
+ text = (
1798
+ "Spoke to client 2026-08-28: household of two, no logins needed; "
1799
+ "calendar is a nice-to-have."
1800
+ )
1801
+ result = run("portal", "note", "sub_1", text)
1802
+ assert result.exit_code == 0, result.output
1803
+ assert "noted: sub_1 #1" in result.output
1804
+
1805
+ [entry] = portal_store.operator_notes_for_submission("sub_1")
1806
+ assert entry.text == text # verbatim — not summarized, not reworded
1807
+ assert entry.actor == "operator:jane"
1808
+ assert entry.kind == portal_store.LEDGER_KIND_OPERATOR_NOTE
1809
+
1810
+
1811
+ def test_note_rejects_an_unknown_submission_with_a_clear_error():
1812
+ from coord import portal_store
1813
+
1814
+ result = run("portal", "note", "sub_nope", "background")
1815
+ assert result.exit_code == 2
1816
+ assert "unknown submission" in result.output
1817
+ assert "sub_nope" in result.output
1818
+ assert portal_store.ledger_for_submission("sub_nope") == []
1819
+
1820
+
1821
+ def test_note_rejects_empty_text():
1822
+ from coord import portal_store
1823
+
1824
+ portal_store.seed_revision("sub_1", 1)
1825
+ result = run("portal", "note", "sub_1", " ")
1826
+ assert result.exit_code == 2
1827
+ assert "non-empty" in result.output
1828
+ assert portal_store.ledger_for_submission("sub_1") == []
1829
+
1830
+
1831
+ def test_ledger_renders_operator_notes_attributed_and_in_seq_order(monkeypatch):
1832
+ """#2867's acceptance bar for the read side: `coord portal ledger` shows
1833
+ the note verbatim, under its own heading, attributed — and never as a
1834
+ decision."""
1835
+ from coord import portal_store
1836
+
1837
+ portal_store.seed_revision("sub_1", 1)
1838
+ monkeypatch.setattr("coord.commands.portal._actor", lambda: "jane")
1839
+ run("portal", "note", "sub_1", "Household of two.")
1840
+ run("portal", "note", "sub_1", "Calendar is a nice-to-have.")
1841
+
1842
+ result = run("portal", "ledger", "sub_1")
1843
+ assert result.exit_code == 0, result.output
1844
+ assert "## Operator notes" in result.output
1845
+ assert "[1] Household of two. (by operator:jane)" in result.output
1846
+ assert "[2] Calendar is a nice-to-have. (by operator:jane)" in result.output
1847
+ # Order is ledger seq order, notes never leak into the Decisions layer.
1848
+ assert result.output.index("Household of two.") < result.output.index(
1849
+ "Calendar is a nice-to-have."
1850
+ )
1851
+ decisions_section = result.output.split("## Decisions", 1)[1]
1852
+ assert "Household of two." not in decisions_section
1853
+
1854
+ as_json = run("portal", "ledger", "sub_1", "--json")
1855
+ assert as_json.exit_code == 0, as_json.output
1856
+ payload = json.loads(as_json.output)
1857
+ assert [n["text"] for n in payload["operator_notes"]] == [
1858
+ "Household of two.",
1859
+ "Calendar is a nice-to-have.",
1860
+ ]
1861
+ assert payload["decisions"] == []
1862
+ assert payload["narrative"] == ""
1863
+
1864
+
1865
+ def test_note_routes_through_the_daemon_on_a_thin_client(thin_client, monkeypatch):
1866
+ """Same #2751 exception `decision`/`ledger`/`link` get: the operator may
1867
+ be sitting anywhere in the fleet, so this must POST `/portal-note`
1868
+ rather than write a thin client's own (empty, wrong) local DB."""
1869
+ from coord import client as cc
1870
+
1871
+ calls = []
1872
+
1873
+ def _fake_post_record(svc, path, payload, **kw):
1874
+ calls.append((path, payload))
1875
+ return {
1876
+ "entry": {
1877
+ "id": 1,
1878
+ "submission_id": payload["submission_id"],
1879
+ "seq": 7,
1880
+ "kind": "operator_note",
1881
+ "question_revision": None,
1882
+ "text": payload["text"],
1883
+ "actor": "operator:jane",
1884
+ "source_event_id": None,
1885
+ "payload_json": "{}",
1886
+ "recorded_at": 100.0,
1887
+ }
1888
+ }
1889
+
1890
+ monkeypatch.setattr(cc, "post_record", _fake_post_record)
1891
+
1892
+ result = run("portal", "note", "sub_1", "Client prefers web-only")
1893
+ assert result.exit_code == 0, result.output
1894
+ assert "noted: sub_1 #7" in result.output
1895
+ assert len(calls) == 1
1896
+ assert calls[0][0] == "/portal-note"
1897
+ assert calls[0][1]["submission_id"] == "sub_1"
1898
+ assert calls[0][1]["text"] == "Client prefers web-only"