code-coordinator 0.5.102__tar.gz → 0.5.105__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 (843) hide show
  1. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. code_coordinator-0.5.105/code_coordinator.egg-info/scm_version.json +8 -0
  4. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/merge_queue.py +121 -10
  5. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/reports.py +140 -0
  6. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/serve_app.py +4 -0
  7. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_merge_queue.py +109 -0
  8. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_reports.py +187 -3
  9. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/Cargo.lock +1 -1
  10. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/Cargo.toml +1 -1
  11. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/fixtures.rs +382 -0
  12. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/mod.rs +24 -0
  13. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/reports.rs +398 -3
  14. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/tests.rs +344 -0
  15. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/types.rs +55 -0
  16. code_coordinator-0.5.102/code_coordinator.egg-info/scm_version.json +0 -8
  17. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.claude/commands/board.md +0 -0
  18. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.claude/commands/complete-session.md +0 -0
  19. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.claude/commands/coordinator.md +0 -0
  20. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.githooks/_lib.sh +0 -0
  21. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.githooks/post-checkout +0 -0
  22. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.githooks/post-commit +0 -0
  23. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.githooks/post-merge +0 -0
  24. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.github/coord-ci-acceptance.yml +0 -0
  26. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.github/workflows/auto-release.yml +0 -0
  27. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.github/workflows/cargo-test.yml +0 -0
  28. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.github/workflows/publish.yml +0 -0
  29. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.github/workflows/release-tui.yml +0 -0
  30. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.github/workflows/test.yml +0 -0
  31. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/.gitignore +0 -0
  32. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/CLAUDE.md +0 -0
  33. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/GOAL.md +0 -0
  34. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/LICENSE +0 -0
  35. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/MANIFEST.in +0 -0
  36. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/README.md +0 -0
  37. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/code_coordinator.egg-info/SOURCES.txt +0 -0
  38. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/code_coordinator.egg-info/dependency_links.txt +0 -0
  39. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/code_coordinator.egg-info/entry_points.txt +0 -0
  40. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/code_coordinator.egg-info/requires.txt +0 -0
  41. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/code_coordinator.egg-info/scm_file_list.json +0 -0
  42. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/code_coordinator.egg-info/top_level.txt +0 -0
  43. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/__init__.py +0 -0
  44. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/_board_mapping.py +0 -0
  45. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/acceptance.py +0 -0
  46. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/acceptance_drivers.py +0 -0
  47. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/agent.py +0 -0
  48. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/agent_app.py +0 -0
  49. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/agent_update.py +0 -0
  50. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/agents/opencode/.gitignore +0 -0
  51. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/agents/opencode/agents/work.md +0 -0
  52. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/agents/opencode/routing.jsonc +0 -0
  53. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/audit.py +0 -0
  54. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/auto_loop.py +0 -0
  55. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/block_log.py +0 -0
  56. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/board_bool_guard.py +0 -0
  57. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/board_service.py +0 -0
  58. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/board_wire.py +0 -0
  59. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/brain.py +0 -0
  60. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/branch_model.py +0 -0
  61. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/bug_intake.py +0 -0
  62. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/cargo_cache.py +0 -0
  63. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/ci_github.py +0 -0
  64. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/ci_store.py +0 -0
  65. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/claim.py +0 -0
  66. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/cli.py +0 -0
  67. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/client.py +0 -0
  68. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/__init__.py +0 -0
  69. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/_common.py +0 -0
  70. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/acceptance.py +0 -0
  71. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/agent_ops.py +0 -0
  72. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/audit.py +0 -0
  73. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/dispatch.py +0 -0
  75. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/dispatch_workers.py +0 -0
  76. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/drive.py +0 -0
  77. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/drive_queue.py +0 -0
  78. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/gate_a.py +0 -0
  79. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/gates.py +0 -0
  80. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/issues.py +0 -0
  81. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/lifecycle.py +0 -0
  82. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/merge.py +0 -0
  83. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/milestone.py +0 -0
  84. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/plan_followup.py +0 -0
  85. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/plans.py +0 -0
  86. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/portal.py +0 -0
  87. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/release.py +0 -0
  88. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/repo.py +0 -0
  89. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/report.py +0 -0
  90. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/review.py +0 -0
  91. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/scorecard.py +0 -0
  92. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/sessions.py +0 -0
  93. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/setup.py +0 -0
  94. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/status.py +0 -0
  95. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/terminal.py +0 -0
  96. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/test_gate.py +0 -0
  97. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/commands/tui.py +0 -0
  98. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/comments.py +0 -0
  99. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/config.py +0 -0
  100. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/conflict_fix.py +0 -0
  101. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dao.py +0 -0
  102. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/__init__.py +0 -0
  103. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/fixture.py +0 -0
  104. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/index.html +0 -0
  105. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/server.py +0 -0
  106. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/terminal.py +0 -0
  107. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/.gitignore +0 -0
  108. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/components.json +0 -0
  109. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  110. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  111. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  112. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  113. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  114. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  115. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  116. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  117. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  118. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/index.html +0 -0
  119. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  120. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/sw.js +0 -0
  121. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  122. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  123. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  124. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  125. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  126. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  127. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  128. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  129. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  130. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  131. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/eslint.config.js +0 -0
  132. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/index.html +0 -0
  133. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  134. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/package-lock.json +0 -0
  135. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/package.json +0 -0
  136. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  137. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/playwright.config.ts +0 -0
  138. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/postcss.config.js +0 -0
  139. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  140. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  141. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  142. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/App.tsx +0 -0
  143. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/api/client.ts +0 -0
  144. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  145. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  146. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  147. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  148. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  149. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  150. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  151. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  152. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  153. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  154. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  155. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  156. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  157. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  158. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  159. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  160. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  161. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  162. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  163. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  164. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  165. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  166. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  167. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  168. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  169. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  170. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  171. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  172. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  173. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  174. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  175. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  176. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  177. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  178. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  179. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/index.css +0 -0
  180. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  181. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  182. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/main.tsx +0 -0
  183. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  184. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  185. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  186. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  187. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  188. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  189. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  190. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  191. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  192. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  193. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  194. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  195. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  196. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  197. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  198. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  199. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  200. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  201. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  202. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  203. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  204. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  205. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  206. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/tailwind.config.js +0 -0
  207. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/tsconfig.json +0 -0
  208. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  209. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dashboard/webapp/vite.config.ts +0 -0
  210. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/db.py +0 -0
  211. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dead_end.py +0 -0
  212. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/README.md +0 -0
  213. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-agent.service +0 -0
  214. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-db-backup.service +0 -0
  215. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-db-backup.sh +0 -0
  216. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-db-backup.timer +0 -0
  217. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-drive-queue.service +0 -0
  218. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-drive-queue.timer +0 -0
  219. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-notify.service +0 -0
  220. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-notify.timer +0 -0
  221. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-release-propagate.service +0 -0
  222. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-release-propagate.timer +0 -0
  223. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-release-window.service +0 -0
  224. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-release-window.timer +0 -0
  225. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-serve.service +0 -0
  226. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-web-dist-build.service +0 -0
  227. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-web-dist-build.timer +0 -0
  228. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy/coord-web.service +0 -0
  229. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy_manifest.py +0 -0
  230. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deploy_units.py +0 -0
  231. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/deps.py +0 -0
  232. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/diagnose.py +0 -0
  233. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dispatch.py +0 -0
  234. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/dist_name.py +0 -0
  235. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/drive.py +0 -0
  236. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/drive_queue.py +0 -0
  237. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/drive_state.py +0 -0
  238. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/events.py +0 -0
  239. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/failure_class.py +0 -0
  240. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/filelock.py +0 -0
  241. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/fleet_config_health.py +0 -0
  242. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/freshness.py +0 -0
  243. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/gate_a.py +0 -0
  244. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/gate_b.py +0 -0
  245. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/gate_snapshot.py +0 -0
  246. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/gates.py +0 -0
  247. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/github_ops.py +0 -0
  248. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/goal.py +0 -0
  249. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/graph_health.py +0 -0
  250. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/__init__.py +0 -0
  251. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/aggregate.py +0 -0
  252. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/__init__.py +0 -0
  253. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/agent_install.py +0 -0
  254. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/cargo_targets.py +0 -0
  255. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/claude_binary.py +0 -0
  256. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/deploy_lane_facts.py +0 -0
  257. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/disk.py +0 -0
  258. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/fleet_board.py +0 -0
  259. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  260. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/fleet_phantom.py +0 -0
  261. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/fleet_unit_drift.py +0 -0
  262. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/graph.py +0 -0
  263. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/graphify_cli.py +0 -0
  264. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/index_lock.py +0 -0
  265. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/plan_usage.py +0 -0
  266. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/repo_state.py +0 -0
  267. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/spawned_coord.py +0 -0
  268. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/timer_active.py +0 -0
  269. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/toolchain.py +0 -0
  270. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/unit_drift.py +0 -0
  271. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/unit_enablement.py +0 -0
  272. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/checks/worktrees.py +0 -0
  273. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/cli.py +0 -0
  274. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/context.py +0 -0
  275. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/fleet_snapshot.py +0 -0
  276. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/models.py +0 -0
  277. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/pypi.py +0 -0
  278. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/registry.py +0 -0
  279. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/render.py +0 -0
  280. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/health/units.py +0 -0
  281. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/hooks.py +0 -0
  282. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/housekeeping.py +0 -0
  283. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/interactive.py +0 -0
  284. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/issue_store.py +0 -0
  285. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/liveness_auditor.py +0 -0
  286. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/machine_pause.py +0 -0
  287. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/milestone_chat.py +0 -0
  288. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/milestone_dispatch.py +0 -0
  289. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/milestone_gate.py +0 -0
  290. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/milestone_order.py +0 -0
  291. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/mock_author.py +0 -0
  292. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/models.py +0 -0
  293. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/network.py +0 -0
  294. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/new_issue_chat.py +0 -0
  295. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notifier/__init__.py +0 -0
  296. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notifier/baseline.py +0 -0
  297. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notifier/cli.py +0 -0
  298. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notifier/collect.py +0 -0
  299. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notifier/digest.py +0 -0
  300. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notifier/models.py +0 -0
  301. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notifier/predicate.py +0 -0
  302. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notifier/service.py +0 -0
  303. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notifier/store.py +0 -0
  304. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notifier/transport.py +0 -0
  305. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/notify.py +0 -0
  306. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/openapi.py +0 -0
  307. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/overlap_fence.py +0 -0
  308. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/overlap_predict.py +0 -0
  309. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/parentage.py +0 -0
  310. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/parentage_github.py +0 -0
  311. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/pipeline.py +0 -0
  312. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/plan_parser.py +0 -0
  313. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/plans.py +0 -0
  314. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/platform_paths.py +0 -0
  315. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/portal_bridge.py +0 -0
  316. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/portal_store.py +0 -0
  317. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/portal_sync.py +0 -0
  318. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/pr_body_lint.py +0 -0
  319. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/prereqs.py +0 -0
  320. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/progress.py +0 -0
  321. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/providers/__init__.py +0 -0
  322. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/providers/base.py +0 -0
  323. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/providers/claude.py +0 -0
  324. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/providers/claude_pty.py +0 -0
  325. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/providers/opencode.py +0 -0
  326. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/queue_diagnose.py +0 -0
  327. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/reconcile.py +0 -0
  328. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/refine_chat.py +0 -0
  329. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/release_cordon.py +0 -0
  330. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/release_propagate.py +0 -0
  331. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/release_verify.py +0 -0
  332. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/release_window.py +0 -0
  333. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/repo_edit.py +0 -0
  334. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/repo_onboard.py +0 -0
  335. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/revalidate.py +0 -0
  336. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/review.py +0 -0
  337. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/scorecard.py +0 -0
  338. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/skills/update-issue/SKILL.md +0 -0
  339. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/smoke.py +0 -0
  340. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/spend_ceiling.py +0 -0
  341. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/split_work.py +0 -0
  342. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/stage_projection.py +0 -0
  343. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/state.py +0 -0
  344. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/test_author.py +0 -0
  345. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/test_chat.py +0 -0
  346. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/test_orchestrator.py +0 -0
  347. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/test_report.py +0 -0
  348. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/tui_release.py +0 -0
  349. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/usage.py +0 -0
  350. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/usage_limits.py +0 -0
  351. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/usage_rollup.py +0 -0
  352. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coord/worker_events.py +0 -0
  353. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/coordinator.example.yml +0 -0
  354. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-agent.service +0 -0
  355. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-db-backup.service +0 -0
  356. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-db-backup.sh +0 -0
  357. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-db-backup.timer +0 -0
  358. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-drive-queue.service +0 -0
  359. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-drive-queue.timer +0 -0
  360. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-notify.service +0 -0
  361. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-notify.timer +0 -0
  362. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-release-propagate.service +0 -0
  363. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-release-propagate.timer +0 -0
  364. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-release-window.service +0 -0
  365. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-release-window.timer +0 -0
  366. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-serve.service +0 -0
  367. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-web-dist-build.service +0 -0
  368. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-web-dist-build.sh +0 -0
  369. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-web-dist-build.timer +0 -0
  370. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-web-rollback.sh +0 -0
  371. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/coord-web.service +0 -0
  372. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/deploy/node-shim.sh +0 -0
  373. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/AGENT_OPERATIONS.md +0 -0
  374. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/ARCHITECTURE.md +0 -0
  375. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/ARCH_SECURITY_GATES.md +0 -0
  376. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/COCKPIT.md +0 -0
  377. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/CONTROL_CENTER.md +0 -0
  378. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/COST_DISCIPLINE.md +0 -0
  379. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/CROSS_PLATFORM.md +0 -0
  380. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/CUSTOMER_PORTAL.md +0 -0
  381. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/DRIVE_QUEUE.md +0 -0
  382. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/EPHEMERAL_WORKERS.md +0 -0
  383. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/FORGE_MIGRATION.md +0 -0
  384. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/GRAPHIFY_SETUP.md +0 -0
  385. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/ISSUE_GUIDANCE.md +0 -0
  386. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/MAC_MINI.md +0 -0
  387. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  388. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/NOTIFIER.md +0 -0
  389. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/OPENCODE_VERIFICATION.md +0 -0
  390. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/OPERATING_GOTCHAS.md +0 -0
  391. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/ORACLE_LOOP.md +0 -0
  392. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/PHONE_WEBAPP.md +0 -0
  393. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/PIPELINE_V2.md +0 -0
  394. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/PLATFORM_EVOLUTION.md +0 -0
  395. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/SECOND_BACKEND.md +0 -0
  396. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/STORE_SERVICE.md +0 -0
  397. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  398. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/WEB_CONTROL_CENTER.md +0 -0
  399. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/mocks/web/README.md +0 -0
  400. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/mocks/web/_tokens.css +0 -0
  401. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/mocks/web/issue-detail.html +0 -0
  402. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/mocks/web/pipeline-narrow.html +0 -0
  403. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/docs/mocks/web/pipeline-wide.html +0 -0
  404. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/graphify-out/.gitignore +0 -0
  405. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/install-agent.sh +0 -0
  406. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/pyproject.toml +0 -0
  407. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/audit_review_verdict_overrides.py +0 -0
  408. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  409. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/azure-workers/build-worker-image.sh +0 -0
  410. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/azure-workers/coordinator-machine.py +0 -0
  411. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/azure-workers/epic-down.sh +0 -0
  412. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/azure-workers/epic-up.sh +0 -0
  413. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/azure-workers/preflight.sh +0 -0
  414. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/azure-workers/provision-worker.sh +0 -0
  415. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  416. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  417. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/azure-workers/verify-github-token.sh +0 -0
  418. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/codegen.py +0 -0
  419. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/coord-test-runner.sh +0 -0
  420. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/drive-batch.sh +0 -0
  421. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/gen_board_fixture.py +0 -0
  422. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/next_release_tag.py +0 -0
  423. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/run_tests_in_populated_home.sh +0 -0
  424. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/run_tests_without_gh.sh +0 -0
  425. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/smoke_437_interactive.py +0 -0
  426. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/verify_878_review_capture.py +0 -0
  427. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/verify_release_published.py +0 -0
  428. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/scripts/verify_release_wheel.py +0 -0
  429. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/setup.cfg +0 -0
  430. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/SMOKE_SET.md +0 -0
  431. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/__init__.py +0 -0
  432. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  433. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-33/contract.md +0 -0
  434. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-33/manifest.yml +0 -0
  435. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  436. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  437. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  438. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  439. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-37/conftest.py +0 -0
  440. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-37/contract.md +0 -0
  441. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-37/manifest.yml +0 -0
  442. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  443. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  444. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/contract.md +0 -0
  445. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/manifest.yml +0 -0
  446. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  447. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  448. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  449. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  450. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  451. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  452. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  453. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  454. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  455. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  456. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-51/contract.md +0 -0
  457. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  458. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  459. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-51/manifest.yml +0 -0
  460. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  461. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-51/tsconfig.json +0 -0
  462. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  463. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/conftest.py +0 -0
  464. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/board-pipeline-basic.json +0 -0
  465. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  466. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  467. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  468. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/playwright/all_pass.json +0 -0
  469. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  470. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/playwright/mixed_fail.json +0 -0
  471. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  472. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  473. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/playwright/skip.json +0 -0
  474. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/playwright/truncated.json +0 -0
  475. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  476. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  477. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  478. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  479. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  480. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  481. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  482. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  483. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_acceptance.py +0 -0
  484. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_acceptance_drivers.py +0 -0
  485. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent.py +0 -0
  486. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_api_error.py +0 -0
  487. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_app.py +0 -0
  488. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_branch_base.py +0 -0
  489. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_branch_capture.py +0 -0
  490. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_config_free_1712.py +0 -0
  491. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_deploy_units_endpoint.py +0 -0
  492. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_dirty_worktree.py +0 -0
  493. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_graph_self_heal.py +0 -0
  494. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_health_h3.py +0 -0
  495. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_idle_restart.py +0 -0
  496. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_push_failure.py +0 -0
  497. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_reap.py +0 -0
  498. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_repos_and_pull.py +0 -0
  499. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_restart_services_endpoint.py +0 -0
  500. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_startup_diagnostics.py +0 -0
  501. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_update.py +0 -0
  502. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_update_bluegreen.py +0 -0
  503. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_usage_limit.py +0 -0
  504. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_agent_zero_commit.py +0 -0
  505. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_ambient_home_isolation.py +0 -0
  506. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_approve_reject_plan.py +0 -0
  507. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_approve_usage_gate.py +0 -0
  508. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_assignment_already_recorded_daemon.py +0 -0
  509. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_audit_log.py +0 -0
  510. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_audit_outcome.py +0 -0
  511. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_audit_query.py +0 -0
  512. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_auto_loop.py +0 -0
  513. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_auto_release_publish_2035.py +0 -0
  514. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_base_checkout_restore.py +0 -0
  515. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_block_log.py +0 -0
  516. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_board_cap_762.py +0 -0
  517. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_board_fixture.py +0 -0
  518. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_board_read_path.py +0 -0
  519. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_board_service.py +0 -0
  520. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_board_state.py +0 -0
  521. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_board_wire.py +0 -0
  522. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_brain.py +0 -0
  523. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_branch_model.py +0 -0
  524. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_bug_intake.py +0 -0
  525. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_build_worker_image_env_update.py +0 -0
  526. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cargo_cache.py +0 -0
  527. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_ci_acceptance_gate_1950.py +0 -0
  528. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_ci_parity_2091.py +0 -0
  529. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_ci_store.py +0 -0
  530. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_claim.py +0 -0
  531. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_acceptance.py +0 -0
  532. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_assign.py +0 -0
  533. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  534. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_assign_interactive_remote.py +0 -0
  535. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_assign_provider.py +0 -0
  536. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  537. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_audit.py +0 -0
  538. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_chat_continue.py +0 -0
  539. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_diagnose_config_provenance.py +0 -0
  540. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_diagnose_graph.py +0 -0
  541. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_doctor.py +0 -0
  542. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_doctor_config_free_1801.py +0 -0
  543. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  544. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_drive.py +0 -0
  545. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_drive_queue.py +0 -0
  546. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_escalate.py +0 -0
  547. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_fix_headless_review.py +0 -0
  548. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_gate_a.py +0 -0
  549. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_install_drift.py +0 -0
  550. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_install_skills.py +0 -0
  551. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_issue_create_label.py +0 -0
  552. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_issue_reopen.py +0 -0
  553. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_merge.py +0 -0
  554. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_milestone_assign.py +0 -0
  555. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_milestone_capture.py +0 -0
  556. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_milestone_chat_add_child.py +0 -0
  557. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_milestone_dispatch.py +0 -0
  558. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_milestone_gate_b.py +0 -0
  559. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_milestone_gate_c.py +0 -0
  560. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_milestone_order.py +0 -0
  561. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  562. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_milestone_ship.py +0 -0
  563. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_network.py +0 -0
  564. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_new_issue_chat.py +0 -0
  565. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_plans.py +0 -0
  566. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_portal.py +0 -0
  567. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_pull_artifact.py +0 -0
  568. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_queue.py +0 -0
  569. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_reattach_sessions.py +0 -0
  570. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_refine_board.py +0 -0
  571. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_release_preflight.py +0 -0
  572. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_release_propagate.py +0 -0
  573. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_release_window.py +0 -0
  574. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_repo_2220.py +0 -0
  575. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_scorecard.py +0 -0
  576. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_set_review_findings.py +0 -0
  577. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_status_advisory_terminal.py +0 -0
  578. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_status_merge_queue.py +0 -0
  579. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_status_provider.py +0 -0
  580. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_status_review_finalizing.py +0 -0
  581. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_status_test_failed_tag.py +0 -0
  582. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_status_usage_limit.py +0 -0
  583. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_sync_comments_873.py +0 -0
  584. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_test_plan.py +0 -0
  585. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_track.py +0 -0
  586. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_tui_update.py +0 -0
  587. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cli_wait.py +0 -0
  588. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_client_base_install.py +0 -0
  589. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_comments.py +0 -0
  590. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_completion_summary.py +0 -0
  591. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_config.py +0 -0
  592. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_config_acceptance.py +0 -0
  593. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_config_audit.py +0 -0
  594. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_config_pricing.py +0 -0
  595. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  596. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_config_usage_gate.py +0 -0
  597. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_conflict_fix.py +0 -0
  598. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_conflict_fix_semantic.py +0 -0
  599. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_coord_test.py +0 -0
  600. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_coord_test_runner_baseline.py +0 -0
  601. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_coord_test_runner_routing.py +0 -0
  602. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_coord_test_runner_toolchain.py +0 -0
  603. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_coord_web_sse_restart_live.py +0 -0
  604. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_coordinator_machine.py +0 -0
  605. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_cross_platform_imports.py +0 -0
  606. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_dashboard.py +0 -0
  607. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_dashboard_fixture.py +0 -0
  608. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_dashboard_terminal.py +0 -0
  609. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_dashboard_terminal_live.py +0 -0
  610. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_db.py +0 -0
  611. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_dead_end.py +0 -0
  612. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_deploy_coord_db_backup.py +0 -0
  613. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_deploy_coord_web_dist.py +0 -0
  614. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_deploy_coord_web_rollback.py +0 -0
  615. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_deploy_drive_queue_unit.py +0 -0
  616. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_deploy_manifest.py +0 -0
  617. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_deploy_units_lane.py +0 -0
  618. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_deploy_web_unit.py +0 -0
  619. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_deps.py +0 -0
  620. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_diagnose.py +0 -0
  621. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_dispatch.py +0 -0
  622. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_dispatch_target_validation.py +0 -0
  623. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_dist_name.py +0 -0
  624. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_done_housekeeping.py +0 -0
  625. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_drive.py +0 -0
  626. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_drive_queue.py +0 -0
  627. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_drive_state.py +0 -0
  628. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_drive_tmux.py +0 -0
  629. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_epic_up_capability_detection.py +0 -0
  630. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  631. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_epic_up_image_provenance.py +0 -0
  632. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_errors.py +0 -0
  633. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_events.py +0 -0
  634. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_failure_class.py +0 -0
  635. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_filelock.py +0 -0
  636. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  637. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_fix_of_force_override.py +0 -0
  638. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_fleet_config_health.py +0 -0
  639. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_fleet_health_probes.py +0 -0
  640. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_fleet_health_snapshot.py +0 -0
  641. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_freshness.py +0 -0
  642. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_gate_a.py +0 -0
  643. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_gate_b.py +0 -0
  644. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_gate_snapshot_staleness.py +0 -0
  645. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_gates.py +0 -0
  646. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  647. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_generated_types_fixture.py +0 -0
  648. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_github_ops.py +0 -0
  649. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_goal.py +0 -0
  650. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_graph_health.py +0 -0
  651. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_graph_selfheal_absent_2237.py +0 -0
  652. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_handoff.py +0 -0
  653. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_checks.py +0 -0
  654. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_cli.py +0 -0
  655. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_cli_graph.py +0 -0
  656. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_config.py +0 -0
  657. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_context.py +0 -0
  658. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_deploy_lane_facts.py +0 -0
  659. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_incident_regression.py +0 -0
  660. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_pypi.py +0 -0
  661. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_registry.py +0 -0
  662. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_timer_active.py +0 -0
  663. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_toolchain.py +0 -0
  664. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_unit_drift.py +0 -0
  665. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_health_unit_enablement.py +0 -0
  666. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_hooks.py +0 -0
  667. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_human_attended_437.py +0 -0
  668. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_init.py +0 -0
  669. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_integration.py +0 -0
  670. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_interactive_briefing_echo.py +0 -0
  671. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_interactive_prefill_state.py +0 -0
  672. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_interactive_session_relaunch.py +0 -0
  673. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_interactive_test_verdict_backstop.py +0 -0
  674. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_interactive_token_attribution.py +0 -0
  675. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_interactive_worktree.py +0 -0
  676. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_issue_store_seam.py +0 -0
  677. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_liveness_auditor.py +0 -0
  678. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_liveness_notify.py +0 -0
  679. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_machine_pause.py +0 -0
  680. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_merge_verify.py +0 -0
  681. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_milestone_chat.py +0 -0
  682. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_milestone_dispatch.py +0 -0
  683. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_milestone_gate.py +0 -0
  684. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_milestone_order.py +0 -0
  685. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_milestone_seam.py +0 -0
  686. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_mock_author.py +0 -0
  687. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_model_tiering.py +0 -0
  688. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_models.py +0 -0
  689. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_models_config_labels.py +0 -0
  690. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_needs_attention.py +0 -0
  691. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_network.py +0 -0
  692. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_new_issue_chat.py +0 -0
  693. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_next_release_tag.py +0 -0
  694. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_no_direct_gh_calls.py +0 -0
  695. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_node_shim.py +0 -0
  696. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notifier_baseline.py +0 -0
  697. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notifier_cli.py +0 -0
  698. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notifier_collect.py +0 -0
  699. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notifier_config.py +0 -0
  700. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notifier_drive_seam.py +0 -0
  701. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notifier_isolation.py +0 -0
  702. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notifier_predicate.py +0 -0
  703. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notifier_quiet_hours.py +0 -0
  704. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notifier_service.py +0 -0
  705. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notify.py +0 -0
  706. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_notify_drain.py +0 -0
  707. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_openapi.py +0 -0
  708. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_operational_defaults.py +0 -0
  709. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_overlap_fence.py +0 -0
  710. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_overlap_predict.py +0 -0
  711. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_packaged_deploy_units.py +0 -0
  712. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_parentage.py +0 -0
  713. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_paste_landed.py +0 -0
  714. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_pipeline.py +0 -0
  715. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_plan_followup_approve_plan_command.py +0 -0
  716. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_plan_followup_pr_command.py +0 -0
  717. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_plan_followup_review_command.py +0 -0
  718. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_plan_only.py +0 -0
  719. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_plan_parser.py +0 -0
  720. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_platform_paths.py +0 -0
  721. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_portal_bridge.py +0 -0
  722. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_portal_config.py +0 -0
  723. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_portal_sync.py +0 -0
  724. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_pr_body_lint.py +0 -0
  725. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_prereqs.py +0 -0
  726. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_production_db_guard.py +0 -0
  727. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_progress.py +0 -0
  728. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_provider_seam.py +0 -0
  729. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_providers.py +0 -0
  730. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_providers_config_labels.py +0 -0
  731. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_providers_pty.py +0 -0
  732. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_quiet_hours.py +0 -0
  733. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_quiet_hours_store_2146.py +0 -0
  734. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_reap_merged_sessions.py +0 -0
  735. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_reap_stale_interactive_tick.py +0 -0
  736. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_reconcile_branch.py +0 -0
  737. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_reconcile_completions.py +0 -0
  738. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_reconcile_merges.py +0 -0
  739. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_reconcile_no_agent_record.py +0 -0
  740. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_reconcile_usage_limit_done.py +0 -0
  741. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_refine_chat.py +0 -0
  742. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_release_cordon_2101.py +0 -0
  743. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  744. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_release_cordon_deadlock_2240.py +0 -0
  745. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_release_propagate.py +0 -0
  746. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_release_unified_1242.py +0 -0
  747. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_release_verify.py +0 -0
  748. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_release_window.py +0 -0
  749. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_remote_auto_prune.py +0 -0
  750. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_remote_interactive_reaper.py +0 -0
  751. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_repo_edit_2220.py +0 -0
  752. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_repo_graph_fleet_2237.py +0 -0
  753. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_repo_onboard_2220.py +0 -0
  754. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_report_result_push.py +0 -0
  755. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_retry.py +0 -0
  756. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_retry_advisory_1606.py +0 -0
  757. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_retry_type_1636.py +0 -0
  758. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_revalidate.py +0 -0
  759. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_review.py +0 -0
  760. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_review_end_review_without_verdict.py +0 -0
  761. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_review_parse_failure_diagnostic.py +0 -0
  762. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_review_reaffirm.py +0 -0
  763. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_review_state.py +0 -0
  764. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_review_verdict_backstop.py +0 -0
  765. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_review_verdict_override_audit.py +0 -0
  766. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_review_verdict_relay.py +0 -0
  767. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_review_zero_commits.py +0 -0
  768. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_scoped_review_wiring.py +0 -0
  769. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_scorecard.py +0 -0
  770. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_serve.py +0 -0
  771. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_serve_app_board_trim.py +0 -0
  772. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_session.py +0 -0
  773. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_slice_issue_attribution.py +0 -0
  774. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_smoke.py +0 -0
  775. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_smoke_live_checkout_restore.py +0 -0
  776. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_smoke_workflow.py +0 -0
  777. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_spend_ceiling.py +0 -0
  778. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_spend_ceiling_coordinator.py +0 -0
  779. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_split.py +0 -0
  780. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_split_work.py +0 -0
  781. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_stage_projection.py +0 -0
  782. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_stalled_pipeline.py +0 -0
  783. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_state.py +0 -0
  784. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_state_review_findings_daemon.py +0 -0
  785. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_status_fleet_footer.py +0 -0
  786. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_stop_1567.py +0 -0
  787. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_stuck.py +0 -0
  788. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_terminal_command.py +0 -0
  789. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_test_author.py +0 -0
  790. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_test_chat.py +0 -0
  791. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_test_orchestrator.py +0 -0
  792. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_test_report.py +0 -0
  793. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_test_verdict_parsing.py +0 -0
  794. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_test_verdict_transcript_floor.py +0 -0
  795. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_thin_client_board_audit.py +0 -0
  796. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_thin_client_config_load_1080.py +0 -0
  797. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_thin_client_daemon_routing_906.py +0 -0
  798. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_tmux_host.py +0 -0
  799. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_tmux_session.py +0 -0
  800. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_transcript_floor.py +0 -0
  801. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_usage.py +0 -0
  802. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_usage_limits.py +0 -0
  803. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_usage_rollup.py +0 -0
  804. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_venv_live_install_2121.py +0 -0
  805. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_version_single_source.py +0 -0
  806. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_watch.py +0 -0
  807. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_worker_events.py +0 -0
  808. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_worker_image_pin_sync.py +0 -0
  809. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_worker_safety.py +0 -0
  810. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_worker_test_scoping.py +0 -0
  811. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_worktree.py +0 -0
  812. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  813. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/cargo-config-local-quadraui.toml.example +0 -0
  814. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/audit.rs +0 -0
  815. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/chat.rs +0 -0
  816. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/data.rs +0 -0
  817. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/dialogs.rs +0 -0
  818. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/drive.rs +0 -0
  819. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/drive_queue.rs +0 -0
  820. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/escalation.rs +0 -0
  821. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/events.rs +0 -0
  822. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/fleet_health.rs +0 -0
  823. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/fleet_sessions.rs +0 -0
  824. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/fleet_terminals.rs +0 -0
  825. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/format.rs +0 -0
  826. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/milestone_dag.rs +0 -0
  827. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/msv.rs +0 -0
  828. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/pipeline.rs +0 -0
  829. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/plans.rs +0 -0
  830. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/render.rs +0 -0
  831. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/sessions.rs +0 -0
  832. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/settings_ui.rs +0 -0
  833. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/sidebar.rs +0 -0
  834. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/terminal.rs +0 -0
  835. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/app/workspace.rs +0 -0
  836. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/bin/gtk.rs +0 -0
  837. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/commands.rs +0 -0
  838. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/lib.rs +0 -0
  839. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/main.rs +0 -0
  840. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/src/settings.rs +0 -0
  841. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/tests/acceptance.rs +0 -0
  842. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/tui/tests/cli.rs +0 -0
  843. {code_coordinator-0.5.102 → code_coordinator-0.5.105}/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.102
3
+ Version: 0.5.105
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.102
3
+ Version: 0.5.105
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
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.105",
3
+ "distance": 0,
4
+ "node": "ge1d2140a49bec59697930f77304b2c0f62eef7c1",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-16"
8
+ }
@@ -4481,6 +4481,63 @@ def _record_expected_red_audit(
4481
4481
  )
4482
4482
 
4483
4483
 
4484
+ def _acceptance_patch_id_matches(
4485
+ entry: "QueuedMerge", acceptance_sha: str, gh_ops: "GhOps",
4486
+ ) -> bool:
4487
+ """#2298: True when *acceptance_sha* — the commit the trust-gate verdict
4488
+ (``coord acceptance record``) was recorded against — introduced the
4489
+ *same content* as the commit that just merged, even though the two
4490
+ SHAs differ.
4491
+
4492
+ The merge queue's own ``checks_stale``/``smoke_required`` gates force a
4493
+ PR sitting behind a moved base to rebase before it can merge at all (a
4494
+ re-run CI needs a fresh SHA to attach to); rebasing rewrites
4495
+ ``branch_head_sha`` by construction. :func:`_maybe_clear_expected_red`
4496
+ treating that SHA change alone as "the content changed" made the two
4497
+ gates mutually unsatisfiable on any PR that had to rebase — every such
4498
+ merge skipped its ``expected_red`` clear and manually needed one, #2298.
4499
+
4500
+ This mirrors the exact rebase-survives-content fingerprint
4501
+ ``has_approved_review`` already uses for the review gate (#1475): a
4502
+ content-addressed patch-id (``git patch-id --stable`` over the unified
4503
+ diff, via ``gh_ops.get_branch_patch_id``) is insensitive to which
4504
+ commit the diff is replayed onto, so a pure rebase (no conflict, no new
4505
+ commits) produces the *same* patch-id from a *different* SHA, while a
4506
+ genuine content change (a conflict resolved differently, an extra
4507
+ commit) does not.
4508
+
4509
+ Compares ``entry.branch_patch_id`` — the diff the commit that just
4510
+ merged actually introduced, backfilled on demand via
4511
+ :func:`_backfill_branch_patch_id` when `process()` never needed it
4512
+ (e.g. neither review nor smoke was required for this entry, the only
4513
+ two gates that consult it pre-merge) — against a patch-id computed
4514
+ fresh for *acceptance_sha* against ``entry.target_branch``.
4515
+ *acceptance_sha* need not be any branch's current tip: per
4516
+ :func:`coord.github_ops.get_compare_diff`'s docstring, GitHub's
4517
+ three-dot compare API accepts a raw commit SHA for *head* exactly like
4518
+ a branch name, the same trick :func:`has_approved_review`'s #1476
4519
+ scoped-re-review path already relies on for an old, superseded review
4520
+ SHA.
4521
+
4522
+ Returns ``False`` — fail closed — whenever either side is unavailable
4523
+ (no patch-id support, a `gh_ops` failure, or *acceptance_sha* no longer
4524
+ resolving, e.g. long since garbage-collected): "cannot confirm
4525
+ identical content" must never read as "confirmed identical".
4526
+ """
4527
+ branch_patch_id = getattr(entry, "branch_patch_id", None)
4528
+ if branch_patch_id is None:
4529
+ branch_patch_id = _backfill_branch_patch_id(entry, gh_ops)
4530
+ if branch_patch_id is None:
4531
+ return False
4532
+ try:
4533
+ acceptance_patch_id = gh_ops.get_branch_patch_id(
4534
+ entry.repo_github, entry.target_branch, acceptance_sha,
4535
+ )
4536
+ except Exception: # noqa: BLE001 — fail-safe, matches _backfill_branch_patch_id
4537
+ acceptance_patch_id = None
4538
+ return acceptance_patch_id is not None and acceptance_patch_id == branch_patch_id
4539
+
4540
+
4484
4541
  def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> MergeEvent | None:
4485
4542
  """#2164: right after *entry*'s PR has actually merged into
4486
4543
  ``entry.target_branch``, clear any of its issue's ``expected_red``
@@ -4508,6 +4565,17 @@ def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> Merge
4508
4565
  printing that same loud, actionable-looking text on every ordinary
4509
4566
  merge fleet-wide, contradicting the acceptance criterion that exempt
4510
4567
  issues and driverless repos stay unaffected.
4568
+
4569
+ #2298: the SHA-exact guard below is no longer the only path to a
4570
+ clear. ``checks_stale``/``smoke_required`` refuse a PR whose CI
4571
+ predates the current base, so a PR that sits long enough for the base
4572
+ to move must rebase to merge at all — which rewrites
4573
+ ``entry.branch_head_sha`` even when nothing about the PR's own diff
4574
+ changed. Comparing SHAs alone made that guard and those gates mutually
4575
+ unsatisfiable on exactly the PRs this whole trust gate exists to
4576
+ protect (every rebased oracle-loop merge). See
4577
+ :func:`_acceptance_patch_id_matches` for the content-addressed
4578
+ fallback that tells a pure rebase apart from a genuine content change.
4511
4579
  """
4512
4580
  if entry.assignment_type not in CLOSES_ISSUE_TYPES:
4513
4581
  return None
@@ -4544,18 +4612,41 @@ def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> Merge
4544
4612
  )
4545
4613
  return MergeEvent(entry, "expected_red_clear_skipped_no_acceptance", msg)
4546
4614
  acceptance_sha = getattr(work, "acceptance_sha", None)
4547
- if acceptance_sha is None or acceptance_sha != entry.branch_head_sha:
4615
+ sha_matches = acceptance_sha is not None and acceptance_sha == entry.branch_head_sha
4616
+ # #2298: a bare SHA mismatch no longer voids the verdict outright.
4617
+ # `checks_stale`/`smoke_required` force a rebase before a PR sitting
4618
+ # behind a moved base can merge at all — which rewrites
4619
+ # `branch_head_sha` on every such PR by construction, making this
4620
+ # guard and those gates mutually unsatisfiable pre-#2298 (see the
4621
+ # issue). Mirror `has_approved_review`'s #1475 patch-id fallback: a
4622
+ # SHA mismatch whose content-addressed patch-id still matches is a
4623
+ # pure rebase, not a stale observation.
4624
+ patch_id_verified = (
4625
+ acceptance_sha is not None
4626
+ and not sha_matches
4627
+ and _acceptance_patch_id_matches(entry, acceptance_sha, gh_ops)
4628
+ )
4629
+ if not sha_matches and not patch_id_verified:
4548
4630
  # The recorded trust-gate verdict isn't for the exact commit that
4549
- # just merged (acceptance never ran, or new commits landed after
4550
- # the last `record`) skip rather than clear on a stale
4551
- # observation. Will pick back up once `record` runs again for the
4552
- # fresh SHA and this issue's fix merges again... though ordinarily
4553
- # a merge only happens once per issue, so a mismatch here more
4554
- # likely means acceptance was simply never recorded for this SHA.
4631
+ # just merged, and its diff doesn't match the merged commit's diff
4632
+ # either (acceptance never ran, a genuine content change landed
4633
+ # after the last `record`, or the patch-id comparison itself
4634
+ # couldn't be confirmed) skip rather than clear on a stale
4635
+ # observation. #2298 (also worth fixing here): the issue this
4636
+ # entry closed is already closed by the time this runs, so
4637
+ # `coord acceptance record --sha` (which targets an *open* issue's
4638
+ # work assignment) has nothing left to attach to; point at the
4639
+ # remedy that actually works from here instead.
4555
4640
  msg = (
4556
- "acceptance_sha does not match the merged commit skipping "
4557
- "expected_red clear (re-run `coord acceptance record` against "
4558
- "the merged SHA if entries should have cleared)"
4641
+ "acceptance_sha does not match the merged commit, and its "
4642
+ "content-addressed patch-id does not confirm a pure rebase "
4643
+ "either (#2298) skipping expected_red clear. If this was "
4644
+ "genuinely just a rebase onto a moved base, clear by hand: "
4645
+ f"`coord acceptance expected-red {entry.repo_name} --clear "
4646
+ f"--issue {entry.issue_number}`. If the content actually "
4647
+ "changed, a fresh `coord acceptance record` against the "
4648
+ "merged SHA (while the issue was still open) was the correct "
4649
+ "fix and did not happen."
4559
4650
  )
4560
4651
  _record_expected_red_audit(
4561
4652
  entry, "expected_red_clear_skipped_sha_mismatch", msg,
@@ -4572,6 +4663,19 @@ def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> Merge
4572
4663
  # manifest, so looking this up afterwards would just find the ids the
4573
4664
  # clear itself just removed (#2266 review non-blocking finding).
4574
4665
  ids = _expected_red_ids_for_entry(entry, gh_ops)
4666
+ if patch_id_verified:
4667
+ # #2298: name the arm taken — a durable row independent of whether
4668
+ # there ends up being anything to clear (the "no_op" branch below
4669
+ # never gets one of those), so this rebase-not-content-change call
4670
+ # is queryable on its own, the same way every other skip/clear
4671
+ # branch here names itself rather than staying silent (#2199).
4672
+ _record_expected_red_audit(
4673
+ entry, "expected_red_sha_mismatch_patch_id_verified",
4674
+ "acceptance_sha does not match the merged commit, but its "
4675
+ "content-addressed patch-id does — a pure rebase, not a "
4676
+ "content change (#2298); proceeding with expected_red clear",
4677
+ test_ids=ids,
4678
+ )
4575
4679
  msg = clear_expected_red_via_pr(
4576
4680
  entry.repo_github, entry.repo_name, entry.target_branch, entry.issue_number,
4577
4681
  gh_ops=gh_ops,
@@ -4594,6 +4698,13 @@ def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> Merge
4594
4698
  "pending_retry": "expected_red_clear_pending",
4595
4699
  "failed": "expected_red_clear_failed",
4596
4700
  }[status]
4701
+ if patch_id_verified:
4702
+ # #2298: keep the arm visible on the terminal `coord merge` line
4703
+ # too, not just in the audit row above.
4704
+ msg = (
4705
+ f"{msg} (acceptance_sha rebased since verdict — content "
4706
+ "verified identical via patch-id, #2298)"
4707
+ )
4597
4708
  # #2266 review (non-blocking finding): `clear_expected_red_via_pr`
4598
4709
  # never raises — every genuine failure degrades to a "warning: ..."
4599
4710
  # string. Make that durable too, not just a merge-output line: a
@@ -59,6 +59,9 @@ __all__ = [
59
59
  "ReportParam",
60
60
  "ReportDef",
61
61
  "ColumnMeta",
62
+ "ChartSeries",
63
+ "ChartSpec",
64
+ "CHART_KINDS",
62
65
  "ReportResult",
63
66
  "REPORTS",
64
67
  "catalogue",
@@ -78,6 +81,7 @@ __all__ = [
78
81
  "QUEUE_OUTCOMES_WINDOW_CHOICES",
79
82
  "resolve_queue_outcomes_window",
80
83
  "fold_queue_outcomes",
84
+ "queue_outcomes_chart",
81
85
  "run_queue_outcomes",
82
86
  "parse_duration",
83
87
  "result_to_csv",
@@ -190,6 +194,90 @@ class ColumnMeta:
190
194
  }
191
195
 
192
196
 
197
+ # ── chart declaration (#2271) ──────────────────────────────────────────────
198
+ #
199
+ # A report says "this table also reads as a chart"; it does NOT ship a second
200
+ # copy of the numbers. Every series names a `columns[]` id and the renderer
201
+ # reads the same `rows` the table renders, so there is exactly one source of
202
+ # truth, the table stays the fallback rendering, and `result_to_csv` (#1765)
203
+ # needs no change at all — it is driven by `columns`/`rows`/`totals` and never
204
+ # looks at this block.
205
+ #
206
+ # THE COMPATIBILITY RULE, same as `ColumnMeta.kind`'s (#1760): a client that
207
+ # does not understand this block, or meets a `kind` it predates, **renders the
208
+ # table and ignores the chart**. It must never fail to parse and must never
209
+ # leave a hole where the chart would have gone. That matters more than usual
210
+ # here because coord-tui ships as a per-host locally-built binary, outside
211
+ # propagation's reach, so the fleet routinely runs mixed versions.
212
+
213
+ #: Open vocabulary — the kinds a client is *expected* to know today. A newer
214
+ #: daemon may name one that is not here; see the compatibility rule above.
215
+ CHART_KINDS = ("bar", "line", "sparkline")
216
+
217
+
218
+ @dataclass(frozen=True)
219
+ class ChartSeries:
220
+ """One series of a :class:`ChartSpec`, derived from an existing column.
221
+
222
+ ``column`` is a ``ReportResult.columns`` id whose per-row value supplies
223
+ the y-values; ``label`` is what the legend shows. ``color`` is an
224
+ optional ``"#rrggbb"`` hint — when :attr:`ChartSpec.group_by` is set the
225
+ series are generated per group and the backend palette picks the colours
226
+ instead, because one declared colour cannot describe N groups.
227
+ """
228
+
229
+ label: str
230
+ column: str
231
+ color: str | None = None
232
+
233
+ def to_dict(self) -> dict[str, Any]:
234
+ return {"label": self.label, "column": self.column, "color": self.color}
235
+
236
+
237
+ @dataclass(frozen=True)
238
+ class ChartSpec:
239
+ """An optional chart rendering of a :class:`ReportResult`'s own rows.
240
+
241
+ Two shapes, and which one you get depends on ``group_by``:
242
+
243
+ * **``group_by is None`` — one data point per row, in the report's
244
+ canonical row order.** ``x`` names the column supplying each point's
245
+ category/time label; each :class:`ChartSeries` reads its own column
246
+ straight off the row. This is the "one bar per category" shape.
247
+ * **``group_by`` set — a pivot.** The x-axis is the *distinct* values of
248
+ ``x`` in first-appearance order, and one output series is produced per
249
+ distinct ``group_by`` value. Rows landing in the same ``(group, x)``
250
+ cell are **summed**, and an empty cell is ``0`` — so this shape is for
251
+ magnitudes (counts, totals), not for averages or rates. This is the
252
+ "one trendline per bucket" shape that a long-form result needs.
253
+
254
+ ``stacked`` is bar-only and ignored by every other kind. Rendering a
255
+ multi-series bar chart at all needs quadraui#584; a client whose pinned
256
+ build predates it must degrade the section to a table with a stated
257
+ reason rather than draw a chart that silently omits every series but the
258
+ first.
259
+ """
260
+
261
+ kind: str
262
+ series: tuple[ChartSeries, ...]
263
+ x: str | None = None
264
+ group_by: str | None = None
265
+ stacked: bool = False
266
+ title: str = ""
267
+ y_label: str = ""
268
+
269
+ def to_dict(self) -> dict[str, Any]:
270
+ return {
271
+ "kind": self.kind,
272
+ "series": [s.to_dict() for s in self.series],
273
+ "x": self.x,
274
+ "group_by": self.group_by,
275
+ "stacked": self.stacked,
276
+ "title": self.title,
277
+ "y_label": self.y_label,
278
+ }
279
+
280
+
193
281
  @dataclass
194
282
  class ReportResult:
195
283
  """The wire contract (#1741 renders against these exact field names).
@@ -210,6 +298,12 @@ class ReportResult:
210
298
  before. Identity columns are deliberately *absent* from the dict rather
211
299
  than filled with a placeholder — a renderer that wants a ``Σ`` marker
212
300
  picks one itself, and one that doesn't leaves the cell blank.
301
+
302
+ ``chart`` (#2271) is an optional declaration that this result also reads
303
+ as a chart, derived from the very columns the table renders — see
304
+ :class:`ChartSpec`. **Additive and defaulting to ``None``**, and a
305
+ client that ignores the key (or meets a ``kind`` it predates) renders the
306
+ table exactly as it did before.
213
307
  """
214
308
 
215
309
  report_id: str
@@ -220,6 +314,7 @@ class ReportResult:
220
314
  notes: list[str]
221
315
  column_meta: list[ColumnMeta] = field(default_factory=list)
222
316
  totals: dict[str, Any] | None = None
317
+ chart: ChartSpec | None = None
223
318
 
224
319
  def to_dict(self) -> dict[str, Any]:
225
320
  return {
@@ -231,6 +326,7 @@ class ReportResult:
231
326
  "rows": list(self.rows),
232
327
  "notes": list(self.notes),
233
328
  "totals": None if self.totals is None else dict(self.totals),
329
+ "chart": None if self.chart is None else self.chart.to_dict(),
234
330
  }
235
331
 
236
332
 
@@ -1677,6 +1773,50 @@ def fold_queue_outcomes(
1677
1773
  rows=rows,
1678
1774
  notes=notes,
1679
1775
  totals=totals,
1776
+ chart=queue_outcomes_chart(rows, n_periods),
1777
+ )
1778
+
1779
+
1780
+ def queue_outcomes_chart(
1781
+ rows: Sequence[Mapping[str, Any]], n_periods: int
1782
+ ) -> ChartSpec | None:
1783
+ """The chart declaration for a ``queue-outcomes`` fold (#2271).
1784
+
1785
+ Exactly the two views the report's own description already promises:
1786
+ ``24h`` is a single period, so it is **one stacked bar per bucket** over
1787
+ the categories in it; ``7d``/``4w`` are the same arithmetic in 7 daily /
1788
+ 4 weekly points, so they are **one trendline per bucket** over
1789
+ ``period_start``. Both derive from ``count`` — the column the table
1790
+ renders — so there is nothing to keep in sync.
1791
+
1792
+ ``None`` when there is nothing to plot: an empty fold is an EMPTY result,
1793
+ and an axis with no marks on it reads as a zero score rather than as no
1794
+ measurement.
1795
+ """
1796
+ if not rows:
1797
+ return None
1798
+ if n_periods > 1:
1799
+ return ChartSpec(
1800
+ kind="line",
1801
+ series=(ChartSeries(label="Entries", column="count"),),
1802
+ x="period_start",
1803
+ group_by="bucket",
1804
+ title="Outcomes per period",
1805
+ y_label="Entries",
1806
+ )
1807
+ # `x` and `group_by` are deliberately the same column. A terminal chart
1808
+ # has a legend but no per-tick category text, so the legend is the only
1809
+ # place a bucket NAME can appear — grouping on the axis column is what
1810
+ # puts "succeeded / auto_resolved_* / human / open" on screen next to its
1811
+ # own colour, instead of five anonymous bars.
1812
+ return ChartSpec(
1813
+ kind="bar",
1814
+ series=(ChartSeries(label="Entries", column="count"),),
1815
+ x="bucket",
1816
+ group_by="bucket",
1817
+ stacked=True,
1818
+ title="Outcomes by bucket",
1819
+ y_label="Entries",
1680
1820
  )
1681
1821
 
1682
1822
 
@@ -3566,6 +3566,10 @@ def _openapi_spec() -> dict:
3566
3566
  "type": ["object", "null"],
3567
3567
  "description": "#1763: optional grand-total row keyed by the same column ids as `rows`. `null` for reports with no meaningful sum (issue-activity, drive-queue-status); a client that ignores it renders exactly as before.",
3568
3568
  },
3569
+ "chart": {
3570
+ "type": ["object", "null"],
3571
+ "description": "#2271: optional chart declaration — `kind` (open vocabulary: bar/line/sparkline), `series[]` each naming a `columns[]` id, `x`, `group_by`, `stacked`. It carries NO numbers of its own; the renderer reads the same `rows` the table does. A client that ignores the key, or meets a `kind` it predates, renders the table and no chart.",
3572
+ },
3569
3573
  },
3570
3574
  "required": [
3571
3575
  "report_id", "generated_at", "window",
@@ -1118,6 +1118,23 @@ class _ExpectedRedGh(FakeGh):
1118
1118
  return "new-sha"
1119
1119
 
1120
1120
 
1121
+ class _PatchIdGh(_ExpectedRedGh):
1122
+ """#2298: `_ExpectedRedGh` + a controllable `get_branch_patch_id`, keyed
1123
+ by the *branch* arg (either the live PR branch name or a bare
1124
+ acceptance_sha) so a test can simulate "same content, different SHA"
1125
+ (a pure rebase) independently of `get_branch_sha`/`branch_head_sha`.
1126
+ """
1127
+
1128
+ def __init__(self, *, patch_ids: dict[str, str | None], **kw):
1129
+ super().__init__(**kw)
1130
+ self._patch_ids = patch_ids
1131
+ self.patch_id_calls: list[tuple[str, str, str]] = []
1132
+
1133
+ def get_branch_patch_id(self, repo: str, base: str, branch: str) -> str | None:
1134
+ self.patch_id_calls.append((repo, base, branch))
1135
+ return self._patch_ids.get(branch)
1136
+
1137
+
1121
1138
  class TestExpectedRedClearOnMerge:
1122
1139
  """#2164 review (blocking finding 1): clearing `expected_red` must wait
1123
1140
  for the fix's own PR to actually merge into the default branch, not
@@ -1372,6 +1389,98 @@ class TestExpectedRedClearOnMerge:
1372
1389
  "SELECT 1 FROM audit_log WHERE event_type = 'expected_red_clear'",
1373
1390
  ).fetchall()
1374
1391
 
1392
+ # ── #2298: SHA mismatch ≠ content change ────────────────────────────
1393
+
1394
+ def test_clears_when_sha_mismatches_but_patch_id_confirms_a_pure_rebase(
1395
+ self,
1396
+ ) -> None:
1397
+ """#2298: `checks_stale`/`smoke_required` force a rebase before a
1398
+ PR sitting behind a moved base can merge at all — which rewrites
1399
+ `branch_head_sha` even when nothing about the PR's own diff
1400
+ changed. A patch-id match (the branch's current diff against
1401
+ target == the diff `acceptance_sha` introduced against target)
1402
+ must clear exactly like an exact-SHA match does, not skip."""
1403
+ work = self._work("w1", acceptance_state="passed", acceptance_sha="old-sha")
1404
+ board = self._board(completed=[work])
1405
+ gh = _PatchIdGh(
1406
+ branch_sha="new-sha", # branch_head_sha != acceptance_sha
1407
+ patch_ids={"worker/w1": "same-patch", "old-sha": "same-patch"},
1408
+ )
1409
+
1410
+ events = process([_q("w1", size=10)], gh, board=board)
1411
+
1412
+ assert events[-1].kind == "expected_red_clear"
1413
+ assert "ms01::a" in events[-1].message
1414
+ assert "patch-id" in events[-1].message # names the arm it took
1415
+ assert gh.update_repo_file_calls # the manifest text was actually edited
1416
+
1417
+ def test_still_skips_when_sha_mismatches_and_patch_id_also_differs(self) -> None:
1418
+ """The counterpart: content genuinely changed after the verdict
1419
+ was recorded (a conflict resolved differently, an extra commit) —
1420
+ must still skip, same named event as a bare SHA mismatch."""
1421
+ work = self._work("w1", acceptance_state="passed", acceptance_sha="old-sha")
1422
+ board = self._board(completed=[work])
1423
+ gh = _PatchIdGh(
1424
+ branch_sha="new-sha",
1425
+ patch_ids={"worker/w1": "patch-new", "old-sha": "patch-old"},
1426
+ )
1427
+
1428
+ events = process([_q("w1", size=10)], gh, board=board)
1429
+
1430
+ assert events[-1].kind == "expected_red_clear_skipped"
1431
+ assert not gh.update_repo_file_calls
1432
+
1433
+ def test_still_skips_when_patch_id_is_unavailable(self) -> None:
1434
+ """Fail closed: a SHA mismatch with no patch-id on either side
1435
+ (an older `gh_ops`, or a lookup failure) must skip exactly like
1436
+ before #2298 — "cannot confirm identical" is never "confirmed"."""
1437
+ work = self._work("w1", acceptance_state="passed", acceptance_sha="old-sha")
1438
+ board = self._board(completed=[work])
1439
+ gh = _PatchIdGh(branch_sha="new-sha", patch_ids={}) # every lookup -> None
1440
+
1441
+ events = process([_q("w1", size=10)], gh, board=board)
1442
+
1443
+ assert events[-1].kind == "expected_red_clear_skipped"
1444
+ assert not gh.update_repo_file_calls
1445
+
1446
+ def test_patch_id_verified_clear_writes_a_distinct_durable_audit_row(
1447
+ self, coord_db,
1448
+ ) -> None:
1449
+ """The rebase-not-content-change arm is queryable on its own —
1450
+ not just implied by the eventual `expected_red_clear` row — the
1451
+ same "name every branch" posture #2199/#2266 already established
1452
+ for the other arms of this function."""
1453
+ work = self._work("w1", acceptance_state="passed", acceptance_sha="old-sha")
1454
+ board = self._board(completed=[work])
1455
+ gh = _PatchIdGh(
1456
+ branch_sha="new-sha",
1457
+ patch_ids={"worker/w1": "same-patch", "old-sha": "same-patch"},
1458
+ )
1459
+
1460
+ process([_q("w1", size=10)], gh, board=board)
1461
+
1462
+ rows = coord_db.execute(
1463
+ "SELECT issue FROM audit_log "
1464
+ "WHERE event_type = 'expected_red_sha_mismatch_patch_id_verified'",
1465
+ ).fetchall()
1466
+ assert len(rows) == 1
1467
+ assert rows[0]["issue"] == 1
1468
+
1469
+ def test_skip_remedy_points_at_a_command_that_works_post_merge(self) -> None:
1470
+ """#2298 (also worth fixing here): the pre-#2298 advice —
1471
+ `coord acceptance record --sha <merged sha>` — targets an open
1472
+ issue's live work assignment. By the time this guard skips, the
1473
+ issue this entry closed is already closed (`gh_ops.close_issue`
1474
+ ran just before this), so that advice leads nowhere. Point at the
1475
+ remedy that actually works from the state the operator is in."""
1476
+ work = self._work("w1", acceptance_state="passed", acceptance_sha="an-old-sha")
1477
+ board = self._board(completed=[work])
1478
+ gh = _ExpectedRedGh(branch_sha="cafesha") # branch_head_sha != acceptance_sha
1479
+
1480
+ events = process([_q("w1", size=10)], gh, board=board)
1481
+
1482
+ assert "coord acceptance expected-red api --clear --issue 1" in events[-1].message
1483
+
1375
1484
 
1376
1485
  class _TestAuthorGateGh(FakeGh):
1377
1486
  """#2191: FakeGh + the API-only manifest/issue-state surface