code-coordinator 0.5.85__tar.gz → 0.5.86__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.
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/PKG-INFO +1 -1
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/merge.py +112 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/merge_queue.py +277 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/serve_app.py +18 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/OPERATING_GOTCHAS.md +70 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_merge.py +176 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_merge_queue.py +363 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_serve.py +112 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.gitignore +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/CLAUDE.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/GOAL.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/LICENSE +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/MANIFEST.in +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/README.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/__init__.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agent.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/audit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/board_service.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/brain.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/claim.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/cli.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/client.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/comments.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/config.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dao.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/db.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deps.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/drive.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/events.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/filelock.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/freshness.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/gates.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/goal.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/context.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/models.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/render.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/units.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/hooks.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/interactive.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/models.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/network.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notify.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/openapi.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/parentage.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/plans.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/progress.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/release_window.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/reports.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/review.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/smoke.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/split_work.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/state.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/test_author.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/test_report.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/usage.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/install-agent.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/pyproject.toml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/setup.cfg +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/__init__.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/conftest.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_config.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_db.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_events.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_init.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_models.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_network.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_session.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_split.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_state.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -317,6 +317,101 @@ def _dispatch_revalidation_conflicts(conflicted, config, *, dry_run: bool) -> No
|
|
|
317
317
|
_dispatch_conflict_fixes(events, config, dry_run=False)
|
|
318
318
|
|
|
319
319
|
|
|
320
|
+
def _sweep_sibling_conflicts(events, items, config, gh_ops, *, dry_run: bool) -> list:
|
|
321
|
+
"""#2246: after a merge lands, ask GitHub which sibling PRs it just broke.
|
|
322
|
+
|
|
323
|
+
A merge into ``target_branch`` can invalidate every other open PR against
|
|
324
|
+
that same branch. GitHub computes exactly which ones, asynchronously and
|
|
325
|
+
for free, and until #2246 nothing asked at the moment it matters —
|
|
326
|
+
``mergeable`` was consulted only at *merge* time, i.e. one drive attempt
|
|
327
|
+
too late. On 2026-08-14 that cost four terminal ``blocked`` entries across
|
|
328
|
+
two repos: quadraui #306/#309 presented as "smoke gate — test verdict
|
|
329
|
+
stale", claude-coordinator #2234 as "checks_failed … (unknown)" with
|
|
330
|
+
``coord fix`` asserting "CI is RED" for a PR whose CI had never run at all
|
|
331
|
+
(GitHub builds ``pull_request`` workflows from ``refs/pull/N/merge``, which
|
|
332
|
+
cannot exist while the PR conflicts, so *zero* check-suites were queued and
|
|
333
|
+
the absence was read as failure — #2244). No surface said *conflict*.
|
|
334
|
+
|
|
335
|
+
Two things happen for each sibling GitHub now reports ``CONFLICTING``,
|
|
336
|
+
both inside :func:`coord.merge_queue.sweep_sibling_conflicts` and the
|
|
337
|
+
dispatch call below:
|
|
338
|
+
|
|
339
|
+
1. The entry is parked at ``CONFLICT`` with an error naming the merge that
|
|
340
|
+
broke it — so the next surface to read it says the true thing instead of
|
|
341
|
+
re-deriving whichever gate happened to be failing for an unrelated
|
|
342
|
+
reason, and ``coord drive``'s #1738 re-test arm stops answering a
|
|
343
|
+
conflict with a suite run.
|
|
344
|
+
2. It is handed to :func:`_dispatch_conflict_fixes` as an ordinary
|
|
345
|
+
``conflict`` event — the SAME call the post-``process()`` path makes —
|
|
346
|
+
so #241's conflict-fix worker is dispatched with every guard intact:
|
|
347
|
+
:func:`coord.merge_queue.classify_conflict` must still read the error as
|
|
348
|
+
``rebaseable``, the #241/#784 retry cap still flips a second failure to
|
|
349
|
+
``HUMAN_REQUIRED``, and ``dispatch_conflict_fix``'s in-flight check
|
|
350
|
+
still refuses a duplicate. Routed through that function rather than
|
|
351
|
+
calling ``dispatch_conflict_fix`` directly for the reason #2231 gives:
|
|
352
|
+
a second dispatch site with its own copy of those guards is how they
|
|
353
|
+
drift apart. That dispatch call can advance ``ev.entry.state`` a
|
|
354
|
+
second time (e.g. to ``HUMAN_REQUIRED`` on a retry-cap hit) — this
|
|
355
|
+
function persists that too, scoped to just the swept entries, so a
|
|
356
|
+
sibling this caller doesn't hold in ``items`` (the ``--only`` path)
|
|
357
|
+
doesn't have its escalation silently dropped on the floor while the
|
|
358
|
+
audit log claims it happened (#2246 review).
|
|
359
|
+
|
|
360
|
+
Skipped entirely under ``--dry-run`` — ``process()`` emits ``merged``
|
|
361
|
+
events there too, but nothing actually landed, so no sibling's mergeability
|
|
362
|
+
can have changed and marking one would be a lie written to the queue.
|
|
363
|
+
|
|
364
|
+
Returns the conflict events so the caller can fold them into its summary;
|
|
365
|
+
never raises (the sweep itself fails open — see its docstring). The merge
|
|
366
|
+
that triggered this has already succeeded and must not be undone or
|
|
367
|
+
obscured by a failed read afterwards.
|
|
368
|
+
"""
|
|
369
|
+
if dry_run:
|
|
370
|
+
return []
|
|
371
|
+
from coord import merge_queue as _mq # noqa: PLC0415
|
|
372
|
+
|
|
373
|
+
try:
|
|
374
|
+
sweep_events = _mq.sweep_sibling_conflicts(events, items, gh_ops)
|
|
375
|
+
except Exception as e: # noqa: BLE001 — never let the sweep undo a merge
|
|
376
|
+
click.echo(
|
|
377
|
+
f" sibling-conflict sweep failed (merge itself is unaffected): {e!r}",
|
|
378
|
+
err=True,
|
|
379
|
+
)
|
|
380
|
+
return []
|
|
381
|
+
for ev in sweep_events:
|
|
382
|
+
e = ev.entry
|
|
383
|
+
click.echo(
|
|
384
|
+
f" {e.repo_name} #{e.issue_number} ({e.branch}): {ev.kind} — "
|
|
385
|
+
f"{ev.message}"
|
|
386
|
+
)
|
|
387
|
+
_dispatch_conflict_fixes(sweep_events, config, dry_run=False)
|
|
388
|
+
# #2246 review: `_dispatch_conflict_fixes` can advance a swept sibling's
|
|
389
|
+
# state a second time in place — e.g. `entry.state = HUMAN_REQUIRED` when
|
|
390
|
+
# `has_prior_conflict_fix` finds this sibling already burned a
|
|
391
|
+
# conflict-fix attempt against an earlier conflict. `mq.sweep_sibling_
|
|
392
|
+
# conflicts` above already persisted its own CONFLICT write, but for a
|
|
393
|
+
# sibling this caller doesn't hold in `items` (the `--only` path, the
|
|
394
|
+
# exact one #2246 targets), nothing after that dispatch call ever writes
|
|
395
|
+
# the newer HUMAN_REQUIRED back — `merge()`'s own final save keys only on
|
|
396
|
+
# `only_entry`. Without this, the audit log records "manual resolution
|
|
397
|
+
# required" while the board/queue still say CONFLICT: the split-brain
|
|
398
|
+
# class this repo's CLAUDE.md calls out (#1832/#2085). Persist here,
|
|
399
|
+
# scoped to just the entries this sweep touched — never the full queue —
|
|
400
|
+
# so a fresh conflict elsewhere isn't clobbered.
|
|
401
|
+
if sweep_events:
|
|
402
|
+
try:
|
|
403
|
+
fresh = _mq.load_queue()
|
|
404
|
+
by_id = {ev.entry.assignment_id: ev.entry for ev in sweep_events}
|
|
405
|
+
_mq.save_queue([by_id.get(x.assignment_id, x) for x in fresh])
|
|
406
|
+
except Exception as e: # noqa: BLE001 — fail open, per the sweep's own contract
|
|
407
|
+
click.echo(
|
|
408
|
+
" sibling-conflict fix-dispatch state failed to persist "
|
|
409
|
+
f"(merge itself is unaffected): {e!r}",
|
|
410
|
+
err=True,
|
|
411
|
+
)
|
|
412
|
+
return sweep_events
|
|
413
|
+
|
|
414
|
+
|
|
320
415
|
def _dispatch_conflict_fixes(events, config, *, dry_run: bool) -> None:
|
|
321
416
|
"""#241: classify any conflict events and dispatch a conflict-fix worker
|
|
322
417
|
for the eligible ones. Mutates each conflict event's ``ev.entry.state``
|
|
@@ -1691,6 +1786,16 @@ def merge(
|
|
|
1691
1786
|
# before the save below so a retry-cap/non-rebaseable HUMAN_REQUIRED
|
|
1692
1787
|
# mutation on only_entry.state is persisted, not lost.
|
|
1693
1788
|
_dispatch_conflict_fixes(events_only, cfg_only, dry_run=dry_run)
|
|
1789
|
+
# #2246: `--only` merges one entry, but the branch it just moved is
|
|
1790
|
+
# shared — every OTHER queued PR based on it may have become
|
|
1791
|
+
# CONFLICTING a second ago. This is the drive-queue's path (`coord
|
|
1792
|
+
# drive` and the TUI both merge via `--only`), so it is exactly where
|
|
1793
|
+
# the 2026-08-14 collisions were minted. The sweep persists any
|
|
1794
|
+
# sibling it parks itself: the save below deliberately writes back
|
|
1795
|
+
# only `only_entry`.
|
|
1796
|
+
_sweep_sibling_conflicts(
|
|
1797
|
+
events_only, only_items, cfg_only, gh_ops, dry_run=dry_run,
|
|
1798
|
+
)
|
|
1694
1799
|
if not dry_run:
|
|
1695
1800
|
# Save only the modified entry back; all other entries are untouched.
|
|
1696
1801
|
all_items_only = mq.load_queue()
|
|
@@ -2003,6 +2108,13 @@ def merge(
|
|
|
2003
2108
|
# review, so the --only path below can share it).
|
|
2004
2109
|
_dispatch_conflict_fixes(events, cfg, dry_run=dry_run)
|
|
2005
2110
|
|
|
2111
|
+
# #2246: whatever just landed may have invalidated its siblings — ask
|
|
2112
|
+
# GitHub now, while the merge that caused it is still the obvious
|
|
2113
|
+
# explanation, rather than letting the next drive attempt discover it as
|
|
2114
|
+
# some unrelated gate failure. Entries it parks are in `items`, so the
|
|
2115
|
+
# save below carries the mutation through naturally.
|
|
2116
|
+
_sweep_sibling_conflicts(events, items, cfg, gh_ops, dry_run=dry_run)
|
|
2117
|
+
|
|
2006
2118
|
# Save state only when we actually moved
|
|
2007
2119
|
if not dry_run:
|
|
2008
2120
|
# Persist the updated entries by merging back over the on-disk queue.
|
|
@@ -3017,6 +3017,283 @@ def reconcile_conflict_entries(gh_ops: "GhOps") -> list["MergeEvent"]:
|
|
|
3017
3017
|
return events
|
|
3018
3018
|
|
|
3019
3019
|
|
|
3020
|
+
# ── Post-merge sibling conflict sweep (#2246) ───────────────────────────────
|
|
3021
|
+
|
|
3022
|
+
#: How many times the sweep re-asks GitHub for a sibling's mergeability while
|
|
3023
|
+
#: it still reads ``UNKNOWN``. GitHub computes ``mergeable`` asynchronously and
|
|
3024
|
+
#: a merge that JUST landed is precisely the moment it is least likely to have
|
|
3025
|
+
#: settled — treating the first ``None`` as "clean" is the bug (#2246), so the
|
|
3026
|
+
#: probe is retried a bounded number of times before giving up.
|
|
3027
|
+
SIBLING_SWEEP_ATTEMPTS = 3
|
|
3028
|
+
|
|
3029
|
+
#: Seconds between sweep probe rounds. Total added wall-clock is at most
|
|
3030
|
+
#: ``(SIBLING_SWEEP_ATTEMPTS - 1) * SIBLING_SWEEP_INTERVAL`` regardless of how
|
|
3031
|
+
#: many siblings are in the queue — see :func:`sweep_sibling_conflicts`, which
|
|
3032
|
+
#: probes in ROUNDS (everyone, then only the still-unresolved) rather than
|
|
3033
|
+
#: exhausting the retry budget per entry.
|
|
3034
|
+
SIBLING_SWEEP_INTERVAL = 2.0
|
|
3035
|
+
|
|
3036
|
+
|
|
3037
|
+
def merged_bases(events: Iterable["MergeEvent"]) -> set[tuple[str, str]]:
|
|
3038
|
+
"""The ``(repo_github, target_branch)`` pairs a batch of events just moved.
|
|
3039
|
+
|
|
3040
|
+
Scoped deliberately to ``kind == "merged"``: a base branch only invalidates
|
|
3041
|
+
siblings when something actually landed on it. Every other event kind
|
|
3042
|
+
(``opened``, ``sized``, ``conflict``, gate blocks) leaves the base exactly
|
|
3043
|
+
where it was and must not trigger a sweep.
|
|
3044
|
+
"""
|
|
3045
|
+
return {
|
|
3046
|
+
(ev.entry.repo_github, ev.entry.target_branch)
|
|
3047
|
+
for ev in events
|
|
3048
|
+
if ev.kind == "merged" and ev.entry.repo_github and ev.entry.target_branch
|
|
3049
|
+
}
|
|
3050
|
+
|
|
3051
|
+
|
|
3052
|
+
def sibling_sweep_candidates(
|
|
3053
|
+
events: Iterable["MergeEvent"], items: Iterable["QueuedMerge"],
|
|
3054
|
+
) -> list["QueuedMerge"]:
|
|
3055
|
+
"""The queue entries a just-landed merge could plausibly have broken.
|
|
3056
|
+
|
|
3057
|
+
An entry qualifies when **all** of the following hold:
|
|
3058
|
+
|
|
3059
|
+
* Its ``(repo_github, target_branch)`` is one the batch actually moved
|
|
3060
|
+
(:func:`merged_bases`) — #2246's "scope to the merged repo, and only to
|
|
3061
|
+
PRs whose base is the branch that just moved".
|
|
3062
|
+
* It is not itself one of the entries that merged.
|
|
3063
|
+
* It has an open PR (``pr_number``) — GitHub can only compute
|
|
3064
|
+
mergeability for a PR, and an entry with no PR has nothing to mark.
|
|
3065
|
+
* It is still ``PENDING``. This is the **transition** filter #2246 asks
|
|
3066
|
+
for, expressed in the state the queue already keeps: ``CONFLICT`` is the
|
|
3067
|
+
durable record of "we already know this one is conflicting", so an entry
|
|
3068
|
+
parked there was somebody else's problem before this merge and is left
|
|
3069
|
+
alone (it is #1477's :func:`reconcile_conflict_entries` that unparks it).
|
|
3070
|
+
``HUMAN_REQUIRED``/``MERGED``/``SKIPPED`` are equally not ours to touch.
|
|
3071
|
+
* Its cached ``error`` does not already read as a conflict. Belt-and-braces
|
|
3072
|
+
for the same rule: an entry can be ``PENDING`` while carrying a conflict
|
|
3073
|
+
error from a prior attempt (a re-enqueue, a #1477 unpark that raced),
|
|
3074
|
+
and re-dispatching a conflict-fix for it on every merge is exactly the
|
|
3075
|
+
loop #2246 says not to build.
|
|
3076
|
+
|
|
3077
|
+
Note what is deliberately *not* required: that the sibling be blocked on
|
|
3078
|
+
some particular gate. The whole point is that the gate it is blocked on
|
|
3079
|
+
(stale smoke verdict, "checks_failed (unknown)") is the WRONG reason — the
|
|
3080
|
+
real blocker is the conflict, and it is only visible if we look regardless.
|
|
3081
|
+
"""
|
|
3082
|
+
moved = merged_bases(events)
|
|
3083
|
+
if not moved:
|
|
3084
|
+
return []
|
|
3085
|
+
merged_ids = {
|
|
3086
|
+
ev.entry.assignment_id for ev in events if ev.kind == "merged"
|
|
3087
|
+
}
|
|
3088
|
+
out: list[QueuedMerge] = []
|
|
3089
|
+
for entry in items:
|
|
3090
|
+
if entry.assignment_id in merged_ids:
|
|
3091
|
+
continue
|
|
3092
|
+
if (entry.repo_github, entry.target_branch) not in moved:
|
|
3093
|
+
continue
|
|
3094
|
+
if entry.state != PENDING or not entry.pr_number:
|
|
3095
|
+
continue
|
|
3096
|
+
if classify_conflict(entry.error) == "rebaseable":
|
|
3097
|
+
continue
|
|
3098
|
+
out.append(entry)
|
|
3099
|
+
return out
|
|
3100
|
+
|
|
3101
|
+
|
|
3102
|
+
def sibling_conflict_error(
|
|
3103
|
+
entry: "QueuedMerge", events: Iterable["MergeEvent"],
|
|
3104
|
+
) -> str:
|
|
3105
|
+
"""The ``entry.error`` text a swept sibling is parked with.
|
|
3106
|
+
|
|
3107
|
+
Two hard requirements, both load-bearing:
|
|
3108
|
+
|
|
3109
|
+
1. It must contain wording :func:`classify_conflict` reads as
|
|
3110
|
+
``"rebaseable"`` (here: ``merge conflict``), because the whole value of
|
|
3111
|
+
the sweep is that ``coord merge``'s existing ``_dispatch_conflict_fixes``
|
|
3112
|
+
step then routes it to the #241 worker with every guard intact — the
|
|
3113
|
+
retry cap, the in-flight check, the HUMAN_REQUIRED escalation.
|
|
3114
|
+
2. It must NOT contain any ``_HUMAN_SIGNALS`` wording ("review required",
|
|
3115
|
+
"permission", "protected branch", …), which would classify it as a
|
|
3116
|
+
branch-protection problem and escalate straight to a human.
|
|
3117
|
+
|
|
3118
|
+
Beyond that it names the merge that caused it, because "which PR broke me"
|
|
3119
|
+
was the fact a human had to reconstruct by hand in both 2026-08-14
|
|
3120
|
+
collisions.
|
|
3121
|
+
"""
|
|
3122
|
+
culprits = sorted({
|
|
3123
|
+
f"{ev.entry.repo_name}#{ev.entry.issue_number}"
|
|
3124
|
+
+ (f" (PR #{ev.entry.pr_number})" if ev.entry.pr_number else "")
|
|
3125
|
+
for ev in events
|
|
3126
|
+
if ev.kind == "merged"
|
|
3127
|
+
and ev.entry.repo_github == entry.repo_github
|
|
3128
|
+
and ev.entry.target_branch == entry.target_branch
|
|
3129
|
+
})
|
|
3130
|
+
blame = ", ".join(culprits) if culprits else "a sibling merge"
|
|
3131
|
+
return (
|
|
3132
|
+
f"merge conflict: GitHub reports PR #{entry.pr_number} ({entry.branch}) "
|
|
3133
|
+
f"as CONFLICTING against {entry.target_branch} immediately after "
|
|
3134
|
+
f"{blame} landed on it. The blocker is a content conflict — not a "
|
|
3135
|
+
"stale test verdict and not a CI failure (a conflicting PR has no "
|
|
3136
|
+
f"{entry.target_branch} merge ref, so GitHub queues no pull_request "
|
|
3137
|
+
"check-suites for it at all). Rebase the branch onto "
|
|
3138
|
+
f"{entry.target_branch} and resolve (#2246)."
|
|
3139
|
+
)
|
|
3140
|
+
|
|
3141
|
+
|
|
3142
|
+
def sweep_sibling_conflicts(
|
|
3143
|
+
events: list["MergeEvent"],
|
|
3144
|
+
items: list["QueuedMerge"],
|
|
3145
|
+
gh_ops: "GhOps",
|
|
3146
|
+
*,
|
|
3147
|
+
attempts: int = SIBLING_SWEEP_ATTEMPTS,
|
|
3148
|
+
interval: float = SIBLING_SWEEP_INTERVAL,
|
|
3149
|
+
sleep=None,
|
|
3150
|
+
persist: bool = True,
|
|
3151
|
+
) -> list["MergeEvent"]:
|
|
3152
|
+
"""Ask GitHub which siblings *events*' merges just broke (#2246).
|
|
3153
|
+
|
|
3154
|
+
When a PR merges it can silently invalidate every other open PR against
|
|
3155
|
+
the same base. GitHub computes that for us exactly and for free, and
|
|
3156
|
+
before this nothing asked at the one moment it matters — ``mergeable`` was
|
|
3157
|
+
only consulted at merge time, i.e. after the next drive attempt was
|
|
3158
|
+
already spent. On 2026-08-14 that cost four terminal ``blocked`` entries
|
|
3159
|
+
across two repos, presented as "smoke gate — test verdict stale" and
|
|
3160
|
+
"checks_failed … (unknown)", neither of which said *conflict*.
|
|
3161
|
+
|
|
3162
|
+
Called immediately after :func:`process` with the events it returned and
|
|
3163
|
+
the item list the caller is about to persist. For every sibling that now
|
|
3164
|
+
reads ``CONFLICTING`` (see :func:`sibling_sweep_candidates` for who
|
|
3165
|
+
qualifies), the entry is moved to ``CONFLICT`` with a
|
|
3166
|
+
:func:`sibling_conflict_error` explaining what happened, and a
|
|
3167
|
+
``conflict`` :class:`MergeEvent` is returned. The caller echoes those
|
|
3168
|
+
events and hands them to its usual conflict-fix dispatch step — the sweep
|
|
3169
|
+
itself never dispatches, so #241's retry cap and in-flight guards keep
|
|
3170
|
+
living in exactly one place.
|
|
3171
|
+
|
|
3172
|
+
**UNKNOWN is not clean.** GitHub recomputes mergeability asynchronously,
|
|
3173
|
+
and the instant after a merge is when it is most likely to still be
|
|
3174
|
+
computing — the first read came back ``UNKNOWN`` repeatedly in the
|
|
3175
|
+
2026-08-14 session. Probing is therefore retried up to *attempts* times,
|
|
3176
|
+
in ROUNDS: every unresolved sibling is probed, then only the ones still
|
|
3177
|
+
unresolved are probed again after *interval* seconds. Total added
|
|
3178
|
+
wall-clock is bounded by ``(attempts - 1) * interval`` no matter how many
|
|
3179
|
+
siblings there are, rather than growing per entry.
|
|
3180
|
+
|
|
3181
|
+
**Fails open, always.** A ``gh`` error, a ``gh_ops`` with no
|
|
3182
|
+
``check_pr_mergeable`` (the duck-typed stubs in older tests), an
|
|
3183
|
+
unreadable queue — every one of them yields "no sweep", never an
|
|
3184
|
+
exception. The merge that triggered this already succeeded; a read failure
|
|
3185
|
+
afterwards must not undo or obscure it.
|
|
3186
|
+
|
|
3187
|
+
Cost is one API call per candidate sibling per merge — single digits on
|
|
3188
|
+
this fleet — and zero when nothing merged, which is the overwhelmingly
|
|
3189
|
+
common tick.
|
|
3190
|
+
|
|
3191
|
+
Persistence: mutations are written straight back to the queue (``persist``
|
|
3192
|
+
is only turned off by tests). Entries the caller already holds in *items*
|
|
3193
|
+
are mutated **in place**, so the caller's own subsequent
|
|
3194
|
+
``save_queue(merge_over_disk)`` step re-writes the same values rather than
|
|
3195
|
+
clobbering them — the same convention
|
|
3196
|
+
``coord.commands.merge._dispatch_conflict_fixes`` relies on. Siblings the
|
|
3197
|
+
caller does *not* hold (the ``--only`` path, where ``items`` is a single
|
|
3198
|
+
entry) are persisted by this function's own write, which reloads the
|
|
3199
|
+
queue fresh and overrides **only** the entries this call itself moved to
|
|
3200
|
+
``CONFLICT`` (one per event in the return value) — never the full *rows*
|
|
3201
|
+
snapshot this function built before its retry-sleep loop, which can be
|
|
3202
|
+
stale by the time we get here and would otherwise clobber any concurrent
|
|
3203
|
+
writer's changes to unrelated rows.
|
|
3204
|
+
"""
|
|
3205
|
+
if not any(ev.kind == "merged" for ev in events):
|
|
3206
|
+
return []
|
|
3207
|
+
probe = getattr(gh_ops, "check_pr_mergeable", None)
|
|
3208
|
+
if probe is None:
|
|
3209
|
+
return []
|
|
3210
|
+
|
|
3211
|
+
try:
|
|
3212
|
+
disk = load_queue()
|
|
3213
|
+
except Exception: # noqa: BLE001 — a queue read error must not undo a merge
|
|
3214
|
+
_log.warning("sibling sweep: could not read the merge queue", exc_info=True)
|
|
3215
|
+
return []
|
|
3216
|
+
|
|
3217
|
+
# Prefer the caller's live objects for any row it already holds: mutating
|
|
3218
|
+
# a second copy loaded here would be silently reverted by the caller's own
|
|
3219
|
+
# save-over-disk step a few lines later.
|
|
3220
|
+
pool = {x.assignment_id: x for x in items}
|
|
3221
|
+
rows = [pool.get(x.assignment_id, x) for x in disk]
|
|
3222
|
+
known = {x.assignment_id for x in rows}
|
|
3223
|
+
rows.extend(x for x in items if x.assignment_id not in known)
|
|
3224
|
+
|
|
3225
|
+
candidates = sibling_sweep_candidates(events, rows)
|
|
3226
|
+
if not candidates:
|
|
3227
|
+
return []
|
|
3228
|
+
|
|
3229
|
+
_sleep = sleep if sleep is not None else time.sleep
|
|
3230
|
+
verdicts: dict[str, bool] = {}
|
|
3231
|
+
unresolved = list(candidates)
|
|
3232
|
+
for attempt in range(max(1, attempts)):
|
|
3233
|
+
if not unresolved:
|
|
3234
|
+
break
|
|
3235
|
+
if attempt:
|
|
3236
|
+
# Only ever paid when GitHub is genuinely still computing.
|
|
3237
|
+
_sleep(interval)
|
|
3238
|
+
still: list[QueuedMerge] = []
|
|
3239
|
+
for entry in unresolved:
|
|
3240
|
+
try:
|
|
3241
|
+
verdict = probe(entry.repo_github, entry.pr_number)
|
|
3242
|
+
except Exception: # noqa: BLE001 — fail open, per entry
|
|
3243
|
+
verdict = None
|
|
3244
|
+
if verdict is None:
|
|
3245
|
+
still.append(entry)
|
|
3246
|
+
else:
|
|
3247
|
+
verdicts[entry.assignment_id] = bool(verdict)
|
|
3248
|
+
unresolved = still
|
|
3249
|
+
|
|
3250
|
+
for entry in unresolved:
|
|
3251
|
+
# Never resolved inside the budget. Deliberately NOT marked: an
|
|
3252
|
+
# inconclusive read is not evidence of a conflict, and #1477's
|
|
3253
|
+
# reconcile pass plus the next ordinary merge attempt will both look
|
|
3254
|
+
# again. Logged so a systematically-slow repo is attributable.
|
|
3255
|
+
_log.info(
|
|
3256
|
+
"sibling sweep: %s#%s (PR #%s) still UNKNOWN after %d attempt(s)"
|
|
3257
|
+
" — left PENDING",
|
|
3258
|
+
entry.repo_name, entry.issue_number, entry.pr_number, max(1, attempts),
|
|
3259
|
+
)
|
|
3260
|
+
|
|
3261
|
+
out: list[MergeEvent] = []
|
|
3262
|
+
for entry in candidates:
|
|
3263
|
+
if verdicts.get(entry.assignment_id) is not False:
|
|
3264
|
+
continue
|
|
3265
|
+
entry.error = sibling_conflict_error(entry, events)
|
|
3266
|
+
entry.state = CONFLICT
|
|
3267
|
+
out.append(MergeEvent(
|
|
3268
|
+
entry, "conflict",
|
|
3269
|
+
f"became CONFLICTING when a sibling merged into "
|
|
3270
|
+
f"{entry.target_branch} — parked as a conflict, not a gate "
|
|
3271
|
+
"failure (#2246)",
|
|
3272
|
+
))
|
|
3273
|
+
|
|
3274
|
+
if out and persist:
|
|
3275
|
+
try:
|
|
3276
|
+
fresh = load_queue()
|
|
3277
|
+
# Scope the override to the entries THIS call actually mutated
|
|
3278
|
+
# (one per `out` event) — never the full `rows` snapshot. `rows`
|
|
3279
|
+
# was built before the retry-sleep loop above (up to
|
|
3280
|
+
# ``(attempts - 1) * interval``, longer under real GitHub
|
|
3281
|
+
# latency), so by the time we get here it can be stale for every
|
|
3282
|
+
# entry in the queue, not just the swept candidates. Building
|
|
3283
|
+
# `by_id` from it and replacing the whole table would silently
|
|
3284
|
+
# revert any concurrent writer's changes to unrelated rows made
|
|
3285
|
+
# during that wait — exactly the convention this function's
|
|
3286
|
+
# docstring promises to follow (mutate in place, override only
|
|
3287
|
+
# what changed, default everything else to the fresh read).
|
|
3288
|
+
by_id = {ev.entry.assignment_id: ev.entry for ev in out}
|
|
3289
|
+
save_queue([by_id.get(x.assignment_id, x) for x in fresh])
|
|
3290
|
+
except Exception: # noqa: BLE001 — fail open
|
|
3291
|
+
_log.warning(
|
|
3292
|
+
"sibling sweep: could not persist conflict markers", exc_info=True,
|
|
3293
|
+
)
|
|
3294
|
+
return out
|
|
3295
|
+
|
|
3296
|
+
|
|
3020
3297
|
def resolve_entry_key(items: list["QueuedMerge"], key: str) -> "QueuedMerge | None":
|
|
3021
3298
|
"""Resolve *key* to a queue entry by whatever identifier the read path
|
|
3022
3299
|
printed — ``assignment_id``, the durable ``repo#issue`` form, a bare
|
|
@@ -1247,6 +1247,24 @@ def _auto_drain_tick(config: Config) -> "list":
|
|
|
1247
1247
|
skip_smoke=False,
|
|
1248
1248
|
)
|
|
1249
1249
|
|
|
1250
|
+
# #2246: anything that just landed may have made a SIBLING PR
|
|
1251
|
+
# CONFLICTING — GitHub knows exactly which, and auto-drain (unlike a
|
|
1252
|
+
# human running `coord merge`) has no other moment to ask. Held inside
|
|
1253
|
+
# the same lock as everything above: it is another full load->mutate->
|
|
1254
|
+
# save of the queue table and would race a concurrent `/merge`
|
|
1255
|
+
# otherwise. Best-effort — a sweep failure must not undo or obscure
|
|
1256
|
+
# the merge that triggered it, nor disable the persist step below.
|
|
1257
|
+
#
|
|
1258
|
+
# Marks only. Auto-drain has never dispatched a conflict-fix (that
|
|
1259
|
+
# lives in the `coord merge` CLI's `_dispatch_conflict_fixes`), and
|
|
1260
|
+
# #2246's floor is that the entry report *conflict* as its blocking
|
|
1261
|
+
# reason instead of whichever gate happened to be red — which is
|
|
1262
|
+
# exactly what parking it at CONFLICT with an explanatory error does.
|
|
1263
|
+
try:
|
|
1264
|
+
events.extend(mq.sweep_sibling_conflicts(events, ready_items, github_ops))
|
|
1265
|
+
except Exception: # noqa: BLE001
|
|
1266
|
+
log.warning("auto-drain: sibling-conflict sweep failed", exc_info=True)
|
|
1267
|
+
|
|
1250
1268
|
# Persist: merge the mutated rows back over the on-disk queue (same
|
|
1251
1269
|
# pattern as ``coord merge`` in cli.py to avoid clobbering unrelated rows).
|
|
1252
1270
|
fresh = mq.load_queue()
|
|
@@ -964,3 +964,73 @@ If the conflict-fix worker itself fails, the #241/#784 retry cap still flips
|
|
|
964
964
|
the entry to `HUMAN_REQUIRED` on the second attempt — rule #10's escape hatch
|
|
965
965
|
applies from there. Nothing here loosens that: this only removes the case
|
|
966
966
|
where **no** mechanism ran at all.
|
|
967
|
+
|
|
968
|
+
## 19. A merge silently breaks its siblings, and until #2246 nothing asked GitHub which ones
|
|
969
|
+
|
|
970
|
+
Rule #18 is about **gate ordering** — a conflict reported as a stale verdict
|
|
971
|
+
because the smoke gate short-circuits first. This one is about **when we
|
|
972
|
+
look**. Both present as "the surface says something that isn't the blocker",
|
|
973
|
+
and they were filed the same day for a reason.
|
|
974
|
+
|
|
975
|
+
When a PR merges, every other open PR against that same base can become
|
|
976
|
+
unmergeable. GitHub computes exactly which ones, asynchronously and for free,
|
|
977
|
+
and `GhOps.check_pr_mergeable` has always been able to read it — but it was
|
|
978
|
+
consulted only at *merge* time, i.e. one drive attempt after the moment that
|
|
979
|
+
mattered. The merge that invalidated the sibling is the event; nothing was
|
|
980
|
+
listening to it.
|
|
981
|
+
|
|
982
|
+
Measured on 2026-08-14, two independent collisions, both through the drive
|
|
983
|
+
queue:
|
|
984
|
+
|
|
985
|
+
| collision | trigger | how it presented | cost |
|
|
986
|
+
|---|---|---|---|
|
|
987
|
+
| quadraui #306, #309 | #307/#308 merged first; all four append to `quadraui/tests/tui_example_driver.rs` | `smoke gate — test verdict stale` | both terminal `blocked`, 2 attempts each, 3 wasted `--revalidate` suite runs, 2 `coord fix` dispatches |
|
|
988
|
+
| claude-coordinator #2234 | #2230 merged; both touch `coord/drive_queue.py` | `checks_failed … (unknown)`, and `coord fix` reported *"CI is RED"* | terminal `blocked`, 2 attempts, a wasted empty commit, one `coord fix` dispatch |
|
|
989
|
+
|
|
990
|
+
In neither case did any surface say *conflict* until a human went looking. In
|
|
991
|
+
the second, **CI had never run at all**: GitHub builds `pull_request`
|
|
992
|
+
workflows from the merge ref (`refs/pull/N/merge`), which cannot exist while
|
|
993
|
+
the PR conflicts, so zero check-suites were queued and the absence was misread
|
|
994
|
+
as failure (that misreading is #2244's arm of the same day).
|
|
995
|
+
|
|
996
|
+
### What runs now
|
|
997
|
+
|
|
998
|
+
Immediately after any merge lands, `merge_queue.sweep_sibling_conflicts` asks
|
|
999
|
+
GitHub about the other queued PRs **in that repo, on the branch that just
|
|
1000
|
+
moved**. A sibling GitHub now reports `CONFLICTING` is parked at `CONFLICT`
|
|
1001
|
+
with an error naming the merge that broke it, and handed to the same
|
|
1002
|
+
`_dispatch_conflict_fixes` call a failed merge attempt makes — so #241's
|
|
1003
|
+
`conflict-fix` worker is dispatched with the retry cap, the in-flight guard,
|
|
1004
|
+
and the `HUMAN_REQUIRED` escalation all intact.
|
|
1005
|
+
|
|
1006
|
+
Wired into `coord merge` (both the whole-queue path and `--only`, which is how
|
|
1007
|
+
`coord drive` and the TUI merge) and into the daemon's auto-drain tick. Never
|
|
1008
|
+
under `--dry-run`: nothing landed, so no sibling's mergeability can have
|
|
1009
|
+
changed and marking one would write a lie into the queue.
|
|
1010
|
+
|
|
1011
|
+
### Four things to know when reading it
|
|
1012
|
+
|
|
1013
|
+
- **`mergeable` is not instant.** GitHub recomputes it asynchronously and the
|
|
1014
|
+
instant after a merge is when it is least likely to have settled — `UNKNOWN`
|
|
1015
|
+
came back repeatedly on 2026-08-14. The probe retries (`SIBLING_SWEEP_ATTEMPTS`,
|
|
1016
|
+
default 3) in **rounds**: everyone, then only the still-unresolved, so total
|
|
1017
|
+
added wall-clock is bounded by the attempt budget however long the queue is.
|
|
1018
|
+
A sibling still `UNKNOWN` when the budget runs out is left `PENDING` — an
|
|
1019
|
+
inconclusive read is not evidence of a conflict.
|
|
1020
|
+
- **Only transitions.** An entry already at `CONFLICT` is never probed. That
|
|
1021
|
+
state is the queue's own record of "we already know", so a PR that was
|
|
1022
|
+
conflicting before the merge is somebody else's problem — #1477's
|
|
1023
|
+
`reconcile_conflict_entries` is what unparks it when the fix lands. Without
|
|
1024
|
+
that rule, every merge in the repo would re-dispatch a conflict-fix for it,
|
|
1025
|
+
forever.
|
|
1026
|
+
- **Cost is one API call per queued sibling per merge**, not per tick. On this
|
|
1027
|
+
fleet that is single digits, and it is exactly zero on the overwhelmingly
|
|
1028
|
+
common tick where nothing merged.
|
|
1029
|
+
- **It fails open.** A `gh` error, an unreadable queue, a `gh_ops` without the
|
|
1030
|
+
probe — every one yields "no sweep", never an exception. The merge that
|
|
1031
|
+
triggered it has already succeeded and must not be undone or obscured by a
|
|
1032
|
+
read that failed afterwards.
|
|
1033
|
+
|
|
1034
|
+
Related: **#1894** — an unavailable CI must not consume retry budget, and a
|
|
1035
|
+
structurally-impossible CI (a conflicting PR has no merge ref, so no
|
|
1036
|
+
check-suite) is the same class.
|