code-coordinator 0.5.76__tar.gz → 0.5.78__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.76 → code_coordinator-0.5.78}/PKG-INFO +1 -1
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/merge.py +68 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/drive.py +170 -14
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/merge_queue.py +107 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/revalidate.py +59 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/DRIVE_QUEUE.md +13 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/OPERATING_GOTCHAS.md +57 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_drive.py +271 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_merge_queue.py +221 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_revalidate.py +271 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.gitignore +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/CLAUDE.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/GOAL.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/LICENSE +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/MANIFEST.in +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/README.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/__init__.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agent.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/audit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/board_service.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/brain.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/claim.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/cli.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/client.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/comments.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/config.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dao.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/db.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deps.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/events.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/filelock.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/freshness.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/gates.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/goal.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/context.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/models.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/render.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/units.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/hooks.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/interactive.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/models.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/network.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notify.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/openapi.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/parentage.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/plans.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/progress.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/release_window.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/reports.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/review.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/smoke.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/split_work.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/state.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/test_author.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/test_report.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/usage.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/install-agent.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/pyproject.toml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/setup.cfg +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/__init__.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/conftest.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_config.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_db.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_events.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_init.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_models.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_network.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_session.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_split.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_state.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -76,6 +76,7 @@ def _apply_revalidation(items, board, config, gh_ops, *, dry_run: bool):
|
|
|
76
76
|
|
|
77
77
|
recorded_any = False
|
|
78
78
|
total_runs = 0
|
|
79
|
+
conflicted: list = []
|
|
79
80
|
groups = _rv.group_candidates(candidates)
|
|
80
81
|
for (repo_name, target_branch), group in groups:
|
|
81
82
|
click.echo(
|
|
@@ -85,6 +86,7 @@ def _apply_revalidation(items, board, config, gh_ops, *, dry_run: bool):
|
|
|
85
86
|
batch = _rv.revalidate_group(group, config, echo=click.echo)
|
|
86
87
|
total_runs += batch.suite_runs
|
|
87
88
|
recorded_any = recorded_any or bool(batch.recorded)
|
|
89
|
+
conflicted.extend(batch.conflicted)
|
|
88
90
|
if not batch.composite.ok:
|
|
89
91
|
# The composite's own failure report — stderr, as before.
|
|
90
92
|
for line in _rv.format_failure(batch.composite):
|
|
@@ -100,6 +102,13 @@ def _apply_revalidation(items, board, config, gh_ops, *, dry_run: bool):
|
|
|
100
102
|
f"{len(candidates)} entry(ies)"
|
|
101
103
|
)
|
|
102
104
|
|
|
105
|
+
# #2231: the composed run just PROVED these branches don't merge. That is
|
|
106
|
+
# not a staleness problem and re-testing can never resolve it — hand it to
|
|
107
|
+
# the mechanism built for it instead of formatting a diagnosis nobody acts
|
|
108
|
+
# on.
|
|
109
|
+
if conflicted:
|
|
110
|
+
_dispatch_revalidation_conflicts(conflicted, config, dry_run=dry_run)
|
|
111
|
+
|
|
103
112
|
if not recorded_any:
|
|
104
113
|
return board
|
|
105
114
|
|
|
@@ -249,6 +258,65 @@ def _reload_board_after_wait(board, *, dry_run: bool):
|
|
|
249
258
|
return refreshed if refreshed is not None else _Board(active=[], completed=[])
|
|
250
259
|
|
|
251
260
|
|
|
261
|
+
def _dispatch_revalidation_conflicts(conflicted, config, *, dry_run: bool) -> None:
|
|
262
|
+
"""#2231: turn ``--revalidate``'s conflict verdict into a #241 dispatch.
|
|
263
|
+
|
|
264
|
+
*conflicted* is :attr:`coord.revalidate.BatchRevalidationResult.conflicted`
|
|
265
|
+
— the candidates whose revalidation run died composing the branch onto its
|
|
266
|
+
current base. ``--revalidate`` already did the expensive, authoritative
|
|
267
|
+
part: it fetched, built a worktree at the live base, ran ``git merge`` and
|
|
268
|
+
watched it fail. That is strictly better evidence than the failed ``gh pr
|
|
269
|
+
merge`` that normally arms this path, and it was being spent on an
|
|
270
|
+
operator-facing paragraph and then discarded (quadraui #306/#309 sat 11h
|
|
271
|
+
each behind a "test verdict stale" gate whose real blocker was a content
|
|
272
|
+
conflict; a human eventually typed ``coord fix --force`` by hand, which is
|
|
273
|
+
#241's own job description).
|
|
274
|
+
|
|
275
|
+
Two things happen per entry, in this order:
|
|
276
|
+
|
|
277
|
+
1. The entry is moved to ``CONFLICT`` with an ``entry.error`` that names
|
|
278
|
+
the conflict (:func:`coord.revalidate.compose_conflict_error`). This is
|
|
279
|
+
the reporting half: the gate reason stops reading (only) "stale
|
|
280
|
+
verdict", so ``coord drive``'s #1738 arm no longer sees a shape it
|
|
281
|
+
would answer with a re-test, and ``merge_queue.process()`` — which acts
|
|
282
|
+
only on ``PENDING`` — leaves the entry alone this pass instead of
|
|
283
|
+
re-deriving the same smoke block. The caller persists the mutation with
|
|
284
|
+
the rest of the queue; nothing is written here.
|
|
285
|
+
2. The entry is handed to :func:`_dispatch_conflict_fixes` as a synthetic
|
|
286
|
+
``conflict`` event, which is the SAME call the whole-queue and
|
|
287
|
+
``--only`` paths make after a live merge attempt. Every guard it owns
|
|
288
|
+
still applies unchanged: :func:`coord.merge_queue.classify_conflict`
|
|
289
|
+
must read the error as ``rebaseable``, the #241/#784 retry cap still
|
|
290
|
+
flips a second failure to ``HUMAN_REQUIRED``, and
|
|
291
|
+
``dispatch_conflict_fix``'s own in-flight check still refuses a
|
|
292
|
+
duplicate. Deliberately routed through that function rather than
|
|
293
|
+
calling ``dispatch_conflict_fix`` directly — a second dispatch site
|
|
294
|
+
with its own copy of those guards is how they drift apart.
|
|
295
|
+
|
|
296
|
+
Under ``--dry-run`` nothing is mutated and nothing is dispatched (the
|
|
297
|
+
revalidation itself never ran either — see :func:`_apply_revalidation`).
|
|
298
|
+
"""
|
|
299
|
+
if dry_run or not conflicted:
|
|
300
|
+
return
|
|
301
|
+
|
|
302
|
+
from coord.merge_queue import CONFLICT, MergeEvent # noqa: PLC0415
|
|
303
|
+
from coord.revalidate import compose_conflict_error # noqa: PLC0415
|
|
304
|
+
|
|
305
|
+
events = []
|
|
306
|
+
for candidate, _result in conflicted:
|
|
307
|
+
entry = candidate.entry
|
|
308
|
+
entry.error = compose_conflict_error(entry)
|
|
309
|
+
entry.state = CONFLICT
|
|
310
|
+
click.echo(
|
|
311
|
+
f" --revalidate: {entry.repo_name} #{entry.issue_number}: "
|
|
312
|
+
"the blocker is a CONFLICT, not a stale verdict — the branch does "
|
|
313
|
+
"not compose onto its base. Routing to the conflict-fix path "
|
|
314
|
+
"(#241) instead of re-testing (#2231)."
|
|
315
|
+
)
|
|
316
|
+
events.append(MergeEvent(entry, "conflict", entry.error))
|
|
317
|
+
_dispatch_conflict_fixes(events, config, dry_run=False)
|
|
318
|
+
|
|
319
|
+
|
|
252
320
|
def _dispatch_conflict_fixes(events, config, *, dry_run: bool) -> None:
|
|
253
321
|
"""#241: classify any conflict events and dispatch a conflict-fix worker
|
|
254
322
|
for the eligible ones. Mutates each conflict event's ``ev.entry.state``
|
|
@@ -289,6 +289,21 @@ class DriveCounters:
|
|
|
289
289
|
# capture deserves its own full budget of cheap waits before the next
|
|
290
290
|
# forced retry.
|
|
291
291
|
gate_wait_rounds: int = 0
|
|
292
|
+
# #2229: the value `merge_attempts` held when the #1738 stale-smoke
|
|
293
|
+
# re-test last fired off a reason read out of `last_merge_diagnostic`
|
|
294
|
+
# rather than off the board (`-1` = never). A de-duplication latch in the
|
|
295
|
+
# same spirit as `review_fix_dispatched_for` above, for the same reason:
|
|
296
|
+
# `coord diagnose --stage test --reset` clears `test_state`, but the board
|
|
297
|
+
# this driver polls needs a beat to show it, and until it does the state
|
|
298
|
+
# is byte-for-byte identical to the one that triggered the re-test —
|
|
299
|
+
# except that, unlike a board `merge_reason`, the captured diagnostic is
|
|
300
|
+
# frozen and CANNOT change on its own. Without the latch a lagging board
|
|
301
|
+
# would burn the whole `max_fix_rounds` budget re-testing off one stale
|
|
302
|
+
# snapshot. Releases when `merge_attempts` advances, i.e. when a real
|
|
303
|
+
# `coord merge --only` attempt has re-captured the diagnostic — which is
|
|
304
|
+
# #2149's rule (act on the snapshot, then go re-validate it for real)
|
|
305
|
+
# expressed as a latch rather than a wait counter.
|
|
306
|
+
stale_smoke_diagnostic_attempt: int = -1
|
|
292
307
|
# #2199: bounded retry for the trust gate's OWN dispatch — distinct from
|
|
293
308
|
# `fix_rounds` (which bounds "the work needs another round" once a
|
|
294
309
|
# verdict, passed or failed, actually landed on the board). This counts
|
|
@@ -2377,19 +2392,112 @@ def _merge_gate_kind(reason: str) -> str | None:
|
|
|
2377
2392
|
_STALE_SMOKE_MARKERS = _mq_stale_smoke_markers
|
|
2378
2393
|
_is_stale_smoke_reason = _mq_is_stale_smoke_reason
|
|
2379
2394
|
|
|
2395
|
+
# #2229: `coord merge --only` prints a gate line per REFUSED gate, and the
|
|
2396
|
+
# same run prints a "waived by this run" variant of that line for a gate the
|
|
2397
|
+
# invocation's own `--skip-review`/`--skip-smoke` disarmed
|
|
2398
|
+
# (`coord.commands.merge`, the `_status` ternary). A waived gate did not
|
|
2399
|
+
# refuse anything, so its line must never be read back as a refusal.
|
|
2400
|
+
_GATE_WAIVED_MARKER = "waived by this run"
|
|
2401
|
+
|
|
2402
|
+
|
|
2403
|
+
def _extract_gate_refusal_reason(diagnostic: str | None) -> str:
|
|
2404
|
+
"""The first smoke/review gate refusal named anywhere in a captured
|
|
2405
|
+
`coord merge --only` *diagnostic*, or ``""`` (#2229).
|
|
2406
|
+
|
|
2407
|
+
Unlike :func:`_extract_gate_block_reason` — which matches only
|
|
2408
|
+
`_explain_missing_only_entry`'s "enqueue blocked by <gate>" wording, i.e.
|
|
2409
|
+
the NOT-YET-ENQUEUED shape — this reads the refusal out of a run where
|
|
2410
|
+
the entry *did* resolve. `coord merge --only` echoes one
|
|
2411
|
+
`` gate <name>: <reason> — will block this merge`` line per failing gate
|
|
2412
|
+
before `process()` runs, and `process()`'s own events (``smoke_required
|
|
2413
|
+
— …``) name it again; both are ordinary lines carrying the same gate
|
|
2414
|
+
vocabulary :func:`_merge_gate_kind` already classifies, so this scans
|
|
2415
|
+
lines rather than pinning one exact format that would silently stop
|
|
2416
|
+
matching the day either message is reworded.
|
|
2417
|
+
|
|
2418
|
+
quadraui#309: that text is the ONLY place the refusal existed. The board
|
|
2419
|
+
plan reported ``READY`` with an empty reason (``merge_queue.plan()``'s
|
|
2420
|
+
`_entry_gate_status` degrades to a no-op without live SHA data — the
|
|
2421
|
+
#1640 door, the #1566 "plan says ready, ``--only`` refuses" split), so
|
|
2422
|
+
`_merge_gate_divergence` saw nothing to classify and the drive spent
|
|
2423
|
+
three blind retries and died — printing this very text in its own death
|
|
2424
|
+
message.
|
|
2425
|
+
"""
|
|
2426
|
+
for line in (diagnostic or "").splitlines():
|
|
2427
|
+
if _GATE_WAIVED_MARKER in line.lower():
|
|
2428
|
+
continue
|
|
2429
|
+
if _merge_gate_kind(line) is not None:
|
|
2430
|
+
return line.strip()
|
|
2431
|
+
return ""
|
|
2432
|
+
|
|
2433
|
+
|
|
2434
|
+
def _effective_merge_gate_reason(
|
|
2435
|
+
state: IssueState, counters: DriveCounters
|
|
2436
|
+
) -> tuple[str, bool]:
|
|
2437
|
+
"""The reason to classify the merge gate from, and whether it came from
|
|
2438
|
+
the captured diagnostic rather than the board (#2229).
|
|
2439
|
+
|
|
2440
|
+
Prefers `state.merge_reason` — live, re-read on every poll. Falls back to
|
|
2441
|
+
`counters.last_merge_diagnostic` only when the board reason names no gate
|
|
2442
|
+
this module knows an action for, because that is exactly the quadraui#309
|
|
2443
|
+
shape: the board is silent while this driver's OWN last `coord merge
|
|
2444
|
+
--only` attempt already captured the refusal verbatim.
|
|
2445
|
+
|
|
2446
|
+
The fallback is a LAST resort, taken only when the board offers no
|
|
2447
|
+
competing live signal — a snapshot must never outrank something being
|
|
2448
|
+
re-read every poll. Three cases keep the board's own reading:
|
|
2449
|
+
|
|
2450
|
+
- ``merge_status == ""`` — "no queue entry at all" is #2078's shape, with
|
|
2451
|
+
its own `_extract_gate_block_reason` bounded-wait arm in
|
|
2452
|
+
:func:`_decide_merge`. #2229 is about the case #2078 skips wholesale:
|
|
2453
|
+
an entry that IS enqueued (READY, PENDING, …) whose refusal only a
|
|
2454
|
+
live attempt ever saw.
|
|
2455
|
+
- ``merge_status == "CONFLICT"`` — a live merge-mechanics block with its
|
|
2456
|
+
own resolution path (#1474/#241's conflict-fix dispatch, reached
|
|
2457
|
+
through the bounded retry below). A re-test does not rebase a branch,
|
|
2458
|
+
and diverting to one is the same stall this issue is about, inverted.
|
|
2459
|
+
- a CI reason (#1891/#1892) — `merge_reason` already carries a live,
|
|
2460
|
+
recognised signal whose only resolution is more real time. Those two
|
|
2461
|
+
bare waits sit right after the divergence check and must keep winning.
|
|
2462
|
+
|
|
2463
|
+
The bool is the caller's warning label: a diagnostic-derived reason is a
|
|
2464
|
+
SNAPSHOT of the last real attempt, refreshed by nothing but another
|
|
2465
|
+
attempt (#2149's lesson — coord-portal#50 waited 2h33m on a cached
|
|
2466
|
+
"review required" that had already cleared). It is strictly fresher than
|
|
2467
|
+
an empty board reason, but it must not be re-acted on indefinitely; see
|
|
2468
|
+
`DriveCounters.stale_smoke_diagnostic_attempt`.
|
|
2469
|
+
"""
|
|
2470
|
+
if _merge_gate_kind(state.merge_reason) is not None:
|
|
2471
|
+
return state.merge_reason, False
|
|
2472
|
+
if state.merge_status == "" or state.merge_status.upper() == "CONFLICT":
|
|
2473
|
+
return state.merge_reason, False
|
|
2474
|
+
if is_ci_pending_reason(state.merge_reason) or is_ci_infra_reason(
|
|
2475
|
+
state.merge_reason
|
|
2476
|
+
):
|
|
2477
|
+
return state.merge_reason, False
|
|
2478
|
+
fallback = _extract_gate_refusal_reason(counters.last_merge_diagnostic)
|
|
2479
|
+
if fallback:
|
|
2480
|
+
return fallback, True
|
|
2481
|
+
return state.merge_reason, False
|
|
2380
2482
|
|
|
2381
|
-
|
|
2483
|
+
|
|
2484
|
+
def _merge_gate_divergence(state: IssueState, reason: str | None = None) -> str | None:
|
|
2382
2485
|
"""``"smoke"``/``"review"`` when *state* shows the #1526 divergence,
|
|
2383
2486
|
else ``None``.
|
|
2384
2487
|
|
|
2385
|
-
The divergence:
|
|
2386
|
-
this SAME state's `work_test_state`/`review_verdict` says the
|
|
2387
|
-
That contradiction can only come from `coord merge` checking
|
|
2388
|
-
this driver's view does not (freshness against the CURRENT
|
|
2389
|
-
not just the terminal verdict) — never from a retry, since
|
|
2390
|
-
input changes by running `coord merge` again unchanged.
|
|
2488
|
+
The divergence: the merge gate's *reason* names a smoke/review block
|
|
2489
|
+
while this SAME state's `work_test_state`/`review_verdict` says the
|
|
2490
|
+
opposite. That contradiction can only come from `coord merge` checking
|
|
2491
|
+
something this driver's view does not (freshness against the CURRENT
|
|
2492
|
+
branch/base, not just the terminal verdict) — never from a retry, since
|
|
2493
|
+
neither input changes by running `coord merge` again unchanged.
|
|
2494
|
+
|
|
2495
|
+
*reason* (#2229) defaults to `state.merge_reason`, the board's own text.
|
|
2496
|
+
:func:`_decide_merge` passes :func:`_effective_merge_gate_reason`'s
|
|
2497
|
+
result instead so a refusal that exists ONLY in the last captured
|
|
2498
|
+
`coord merge --only` diagnostic still classifies.
|
|
2391
2499
|
"""
|
|
2392
|
-
kind = _merge_gate_kind(state.merge_reason)
|
|
2500
|
+
kind = _merge_gate_kind(state.merge_reason if reason is None else reason)
|
|
2393
2501
|
if kind == "smoke" and state.work_test_state in ("passed", "skipped"):
|
|
2394
2502
|
return "smoke"
|
|
2395
2503
|
if kind == "review" and state.review_verdict == "approve":
|
|
@@ -2398,7 +2506,11 @@ def _merge_gate_divergence(state: IssueState) -> str | None:
|
|
|
2398
2506
|
|
|
2399
2507
|
|
|
2400
2508
|
def _escalate_merge(
|
|
2401
|
-
state: IssueState,
|
|
2509
|
+
state: IssueState,
|
|
2510
|
+
status: str,
|
|
2511
|
+
*,
|
|
2512
|
+
gate_kind: str | None = None,
|
|
2513
|
+
gate_reason: str | None = None,
|
|
2402
2514
|
) -> Action:
|
|
2403
2515
|
"""Build the EXIT action for a merge status retrying cannot fix (#1505).
|
|
2404
2516
|
|
|
@@ -2422,6 +2534,16 @@ def _escalate_merge(
|
|
|
2422
2534
|
(re-confirm the test verdict, or a scoped/full re-review) rather than the
|
|
2423
2535
|
generic "inspect the plan" fallback below.
|
|
2424
2536
|
|
|
2537
|
+
*gate_reason* (#2229) is the text that gate_kind was classified from,
|
|
2538
|
+
when it is NOT `state.merge_reason` — i.e. when the board carried no
|
|
2539
|
+
reason and :func:`_effective_merge_gate_reason` recovered the refusal
|
|
2540
|
+
from the last captured `coord merge --only` diagnostic instead. The
|
|
2541
|
+
escalation narrative quotes it, because ``reports ''`` is exactly the
|
|
2542
|
+
unactionable escalation quadraui#309 would otherwise have produced. The
|
|
2543
|
+
recorded ``--gate merge_reason=…`` pair still reports the BOARD's own
|
|
2544
|
+
(empty) value — the gates block is a snapshot of board state, and
|
|
2545
|
+
overwriting it here would hide the very divergence being escalated.
|
|
2546
|
+
|
|
2425
2547
|
Otherwise, the proposed command mirrors the #1477 resolution this issue
|
|
2426
2548
|
was opened over: when a PR is known, ``gh pr merge --rebase`` + ``coord
|
|
2427
2549
|
reconcile-merges`` is the sanctioned escape hatch (also documented in
|
|
@@ -2468,9 +2590,10 @@ def _escalate_merge(
|
|
|
2468
2590
|
if gate_kind == "smoke"
|
|
2469
2591
|
else f"review_verdict={state.review_verdict!r}"
|
|
2470
2592
|
)
|
|
2593
|
+
reported = state.merge_reason if gate_reason is None else gate_reason
|
|
2471
2594
|
reason = (
|
|
2472
2595
|
f"{gate_kind}_required — coord merge's own gate reports "
|
|
2473
|
-
f"{
|
|
2596
|
+
f"{reported!r}, but this driver's OWN view already "
|
|
2474
2597
|
f"shows {driver_view} — the two cannot converge by retrying the "
|
|
2475
2598
|
"identical `coord merge` command (#1526); a human must "
|
|
2476
2599
|
"reconcile them"
|
|
@@ -2562,8 +2685,30 @@ def _decide_merge(
|
|
|
2562
2685
|
readings; retrying the identical ``coord merge`` command changes neither
|
|
2563
2686
|
side of the disagreement.
|
|
2564
2687
|
"""
|
|
2565
|
-
|
|
2566
|
-
|
|
2688
|
+
# #2229: classify from the board's `merge_reason` when it names a gate,
|
|
2689
|
+
# and otherwise from this driver's OWN last `coord merge --only` output.
|
|
2690
|
+
# quadraui#309 sat blocked for 11h on a merge that landed first try by
|
|
2691
|
+
# hand because the board reason was empty (#1566/#1640) while the
|
|
2692
|
+
# captured diagnostic said, in as many words, "smoke test verdict is
|
|
2693
|
+
# stale" — the exact string the #1738 auto-repair arm below keys on. It
|
|
2694
|
+
# was used for one thing: being printed into the give-up message.
|
|
2695
|
+
gate_reason, gate_reason_from_diagnostic = _effective_merge_gate_reason(
|
|
2696
|
+
state, counters
|
|
2697
|
+
)
|
|
2698
|
+
divergence = _merge_gate_divergence(state, reason=gate_reason)
|
|
2699
|
+
if (
|
|
2700
|
+
gate_reason_from_diagnostic
|
|
2701
|
+
and divergence == "smoke"
|
|
2702
|
+
and _is_stale_smoke_reason(gate_reason)
|
|
2703
|
+
and counters.stale_smoke_diagnostic_attempt == counters.merge_attempts
|
|
2704
|
+
):
|
|
2705
|
+
# A re-test already fired off THIS snapshot and no real attempt has
|
|
2706
|
+
# re-captured it since, so re-firing would spend a second fix round
|
|
2707
|
+
# on evidence that literally cannot have changed. Drop to the bounded
|
|
2708
|
+
# retry below instead: that attempt refreshes the diagnostic, which
|
|
2709
|
+
# either lands the merge or re-arms this arm against fresh evidence.
|
|
2710
|
+
divergence = None
|
|
2711
|
+
if divergence == "smoke" and _is_stale_smoke_reason(gate_reason):
|
|
2567
2712
|
# #1738: a STALE (not missing) smoke verdict has a safe, bounded
|
|
2568
2713
|
# self-service fix this driver can take without a human — re-run the
|
|
2569
2714
|
# Test stage against the current base via the same non-destructive
|
|
@@ -2575,8 +2720,17 @@ def _decide_merge(
|
|
|
2575
2720
|
# going stale (e.g. a base that keeps moving under it) still
|
|
2576
2721
|
# converges to an escalation instead of spinning forever.
|
|
2577
2722
|
if counters.fix_rounds >= opts.max_fix_rounds:
|
|
2578
|
-
return _escalate_merge(
|
|
2723
|
+
return _escalate_merge(
|
|
2724
|
+
state,
|
|
2725
|
+
state.merge_status,
|
|
2726
|
+
gate_kind=divergence,
|
|
2727
|
+
gate_reason=gate_reason,
|
|
2728
|
+
)
|
|
2579
2729
|
counters.fix_rounds += 1
|
|
2730
|
+
if gate_reason_from_diagnostic:
|
|
2731
|
+
# #2229: arm the latch above — one re-test per captured
|
|
2732
|
+
# diagnostic, then a real attempt has to re-validate it.
|
|
2733
|
+
counters.stale_smoke_diagnostic_attempt = counters.merge_attempts
|
|
2580
2734
|
return Action(
|
|
2581
2735
|
kind=RUN,
|
|
2582
2736
|
label=(
|
|
@@ -2597,7 +2751,9 @@ def _decide_merge(
|
|
|
2597
2751
|
),
|
|
2598
2752
|
)
|
|
2599
2753
|
if divergence is not None:
|
|
2600
|
-
return _escalate_merge(
|
|
2754
|
+
return _escalate_merge(
|
|
2755
|
+
state, state.merge_status, gate_kind=divergence, gate_reason=gate_reason
|
|
2756
|
+
)
|
|
2601
2757
|
|
|
2602
2758
|
# #1891: a CI verdict that has not arrived is not a CI verdict of "no" —
|
|
2603
2759
|
# checked BEFORE the `status` switch below (and regardless of what
|
|
@@ -1906,6 +1906,67 @@ def evaluate_smoke_verdict(
|
|
|
1906
1906
|
)
|
|
1907
1907
|
|
|
1908
1908
|
|
|
1909
|
+
def stale_smoke_conflict_reason(entry, smoke, gh_ops) -> str | None:
|
|
1910
|
+
"""#2231: the conflict hiding behind a stale-verdict smoke block, if any.
|
|
1911
|
+
|
|
1912
|
+
Gate evaluation is ordered (review → smoke → CI → …) and every gate
|
|
1913
|
+
short-circuits, so an entry whose branch does not merge AT ALL never gets
|
|
1914
|
+
that far: it reports "test verdict stale", which invites exactly the one
|
|
1915
|
+
remedy that cannot work. Worse, the two mechanisms that could fix it are
|
|
1916
|
+
both downstream of a step that never runs — #1738's auto-repair answers a
|
|
1917
|
+
stale verdict (there wasn't one) and #241's conflict-fix is dispatched off
|
|
1918
|
+
a failed *merge attempt* (the smoke gate returned before one happened).
|
|
1919
|
+
quadraui #306/#309 spent 11h there apiece.
|
|
1920
|
+
|
|
1921
|
+
So: when the smoke gate is about to block on a **stale** verdict
|
|
1922
|
+
specifically, ask GitHub whether the PR merges at all. A confirmed
|
|
1923
|
+
``mergeable: false`` means the stale verdict is not the blocker, and this
|
|
1924
|
+
returns a reason naming the conflict — the caller turns that into a
|
|
1925
|
+
``conflict`` event, which is what arms :func:`classify_conflict` and #241.
|
|
1926
|
+
|
|
1927
|
+
Returns ``None`` — leaving today's stale-verdict block exactly as it was —
|
|
1928
|
+
whenever the answer isn't a definite yes:
|
|
1929
|
+
|
|
1930
|
+
* the verdict is MISSING rather than stale (the #1640 lost-write shape,
|
|
1931
|
+
deliberately out of scope here as in :func:`revalidation_candidates`);
|
|
1932
|
+
* there is no PR yet, so there is nothing to ask about;
|
|
1933
|
+
* ``gh_ops`` has no ``check_pr_mergeable`` — the same duck-typed probe the
|
|
1934
|
+
#1877 CI-absent branch uses, and for the same reason: this function also
|
|
1935
|
+
runs against a :class:`~coord.gate_snapshot.GateSnapshot` on the
|
|
1936
|
+
``/board`` read path (#1336 Invariant 1, no third-party I/O), which
|
|
1937
|
+
doesn't implement it;
|
|
1938
|
+
* the probe returns ``None`` (GitHub still computing mergeability) or
|
|
1939
|
+
raises. An inconclusive read must never be upgraded to "conflict": that
|
|
1940
|
+
would replace a recoverable staleness block with one that dispatches a
|
|
1941
|
+
rebase worker at a branch which merges fine.
|
|
1942
|
+
|
|
1943
|
+
The wording is load-bearing in both directions — see
|
|
1944
|
+
:func:`coord.revalidate.compose_conflict_error`, whose docstring explains
|
|
1945
|
+
the same constraint for the local-compose variant of this fact.
|
|
1946
|
+
"""
|
|
1947
|
+
if smoke is None or smoke.ok or smoke.kind != SMOKE_STALE:
|
|
1948
|
+
return None
|
|
1949
|
+
pr_number = getattr(entry, "pr_number", None)
|
|
1950
|
+
if not pr_number:
|
|
1951
|
+
return None
|
|
1952
|
+
probe = getattr(gh_ops, "check_pr_mergeable", None)
|
|
1953
|
+
if probe is None:
|
|
1954
|
+
return None
|
|
1955
|
+
try:
|
|
1956
|
+
conflicted = probe(entry.repo_github, pr_number) is False
|
|
1957
|
+
except Exception: # noqa: BLE001 — inconclusive, never a block upgrade
|
|
1958
|
+
return None
|
|
1959
|
+
if not conflicted:
|
|
1960
|
+
return None
|
|
1961
|
+
return (
|
|
1962
|
+
f"merge conflict: PR #{pr_number} does not merge into "
|
|
1963
|
+
f"{entry.target_branch} — GitHub reports it as not mergeable. Its "
|
|
1964
|
+
"test verdict is out of date against the current base too, but that "
|
|
1965
|
+
"is downstream: no re-test can clear a branch that will not merge "
|
|
1966
|
+
"(#2231)"
|
|
1967
|
+
)
|
|
1968
|
+
|
|
1969
|
+
|
|
1909
1970
|
@dataclass(frozen=True)
|
|
1910
1971
|
class RevalidationCandidate:
|
|
1911
1972
|
"""One queue entry that ``coord merge --revalidate`` may re-test (#1769).
|
|
@@ -3184,6 +3245,19 @@ def _entry_gate_status(
|
|
|
3184
3245
|
# write instead of re-verifying against the moved base.
|
|
3185
3246
|
smoke = evaluate_smoke_verdict(entry, board, gh_ops)
|
|
3186
3247
|
if not smoke.ok:
|
|
3248
|
+
# #2231: name the conflict when there is one — the plan view
|
|
3249
|
+
# is where an operator (and `coord drive`, via the board's
|
|
3250
|
+
# `merge_reason`) reads WHY an entry is stuck, and "test
|
|
3251
|
+
# verdict stale" on a branch that doesn't compose sends both
|
|
3252
|
+
# of them at a remedy that cannot work. Costs one `gh` call,
|
|
3253
|
+
# only for an entry already blocked on a STALE verdict, and
|
|
3254
|
+
# only where a live probe exists (never on the `/board` read
|
|
3255
|
+
# path — see `stale_smoke_conflict_reason`).
|
|
3256
|
+
conflict_reason = stale_smoke_conflict_reason(
|
|
3257
|
+
entry, smoke, gh_ops,
|
|
3258
|
+
)
|
|
3259
|
+
if conflict_reason is not None:
|
|
3260
|
+
return PLAN_BLOCKED, conflict_reason
|
|
3187
3261
|
return PLAN_BLOCKED, smoke.short_reason
|
|
3188
3262
|
if ci_store is not None and ci_store.is_available and entry.pr_number:
|
|
3189
3263
|
checks = ci_store.list_checks_for_pr(entry.repo_github, entry.pr_number)
|
|
@@ -4279,6 +4353,23 @@ def process(
|
|
|
4279
4353
|
else evaluate_smoke_verdict(entry, board, gh_ops)
|
|
4280
4354
|
)
|
|
4281
4355
|
if _smoke is None or not _smoke.ok:
|
|
4356
|
+
# #2231: mirror the live path (line ~4689) — before
|
|
4357
|
+
# previewing a block on a stale verdict, check whether
|
|
4358
|
+
# the branch is actually conflicted. A dry run that
|
|
4359
|
+
# skips this reports the misleading "test verdict
|
|
4360
|
+
# stale" headline for an entry a real run (or
|
|
4361
|
+
# `--plan`) would already report/dispatch as
|
|
4362
|
+
# `conflict`, which is precisely the split-brain this
|
|
4363
|
+
# issue exists to fix.
|
|
4364
|
+
_conflict_msg = stale_smoke_conflict_reason(
|
|
4365
|
+
entry, _smoke, gh_ops,
|
|
4366
|
+
)
|
|
4367
|
+
if _conflict_msg is not None:
|
|
4368
|
+
events.append(MergeEvent(
|
|
4369
|
+
entry, "conflict",
|
|
4370
|
+
f"(dry run) {_conflict_msg}",
|
|
4371
|
+
))
|
|
4372
|
+
continue
|
|
4282
4373
|
_why = (
|
|
4283
4374
|
"board unavailable to confirm smoke verdict"
|
|
4284
4375
|
if _smoke is None
|
|
@@ -4606,6 +4697,22 @@ def process(
|
|
|
4606
4697
|
None if board is None else evaluate_smoke_verdict(entry, board, gh_ops)
|
|
4607
4698
|
)
|
|
4608
4699
|
if smoke is None or not smoke.ok:
|
|
4700
|
+
# #2231: before parking this entry behind a gate whose
|
|
4701
|
+
# stated cause invites a re-test, check whether the branch
|
|
4702
|
+
# merges at all. A confirmed conflict is the real blocker
|
|
4703
|
+
# and a re-test can never clear it — emit the `conflict`
|
|
4704
|
+
# event so `_dispatch_conflict_fixes` arms #241's rebase
|
|
4705
|
+
# worker, exactly as a failed merge attempt would have.
|
|
4706
|
+
conflict_msg = stale_smoke_conflict_reason(
|
|
4707
|
+
entry, smoke, gh_ops,
|
|
4708
|
+
)
|
|
4709
|
+
if conflict_msg is not None:
|
|
4710
|
+
entry.state = CONFLICT
|
|
4711
|
+
entry.error = conflict_msg
|
|
4712
|
+
events.append(
|
|
4713
|
+
MergeEvent(entry, "conflict", conflict_msg)
|
|
4714
|
+
)
|
|
4715
|
+
continue
|
|
4609
4716
|
msg = (
|
|
4610
4717
|
"smoke test required but board unavailable to confirm verdict"
|
|
4611
4718
|
if smoke is None
|
|
@@ -379,6 +379,15 @@ class BatchRevalidationResult:
|
|
|
379
379
|
A red composite fills ``per_entry`` with one solo result per candidate.
|
|
380
380
|
``recorded`` then holds only the survivors' assignment ids, and
|
|
381
381
|
``culprits`` names the branches whose own run failed.
|
|
382
|
+
|
|
383
|
+
``conflicted`` (#2231) is the subset of the culprits whose run died at
|
|
384
|
+
:data:`KIND_COMPOSE` — the branch does not merge onto its current base at
|
|
385
|
+
all. That is categorically different from every other culprit: no verdict
|
|
386
|
+
is wrong, no suite is red, and no amount of re-testing can change it. It
|
|
387
|
+
carries the *candidate* (not just its label) precisely so a caller can act
|
|
388
|
+
on it — see :func:`coord.commands.merge._dispatch_revalidation_conflicts`,
|
|
389
|
+
which turns it into #241's ``conflict-fix`` dispatch. Before #2231 this
|
|
390
|
+
diagnosis was formatted for a human and then dropped on the floor.
|
|
382
391
|
"""
|
|
383
392
|
|
|
384
393
|
composite: RevalidationResult
|
|
@@ -386,6 +395,9 @@ class BatchRevalidationResult:
|
|
|
386
395
|
recorded: list[str] = field(default_factory=list)
|
|
387
396
|
culprits: list[str] = field(default_factory=list)
|
|
388
397
|
suite_runs: int = 0
|
|
398
|
+
conflicted: list[tuple[RevalidationCandidate, RevalidationResult]] = field(
|
|
399
|
+
default_factory=list,
|
|
400
|
+
)
|
|
389
401
|
|
|
390
402
|
@property
|
|
391
403
|
def ok(self) -> bool:
|
|
@@ -1000,6 +1012,16 @@ def revalidate_group(
|
|
|
1000
1012
|
)
|
|
1001
1013
|
|
|
1002
1014
|
if composite.ok or len(candidates) == 1 or not composite.narrowable:
|
|
1015
|
+
# #2231: a single-candidate composite IS that candidate's own run, so
|
|
1016
|
+
# a COMPOSE failure here names it as surely as a solo run would. The
|
|
1017
|
+
# N>1 case is attributed in the per-entry loop below instead — the
|
|
1018
|
+
# composite stops at the FIRST branch that won't merge, which says
|
|
1019
|
+
# nothing about the ones after it.
|
|
1020
|
+
if (
|
|
1021
|
+
len(candidates) == 1
|
|
1022
|
+
and composite.kind == KIND_COMPOSE
|
|
1023
|
+
):
|
|
1024
|
+
batch.conflicted.append((candidates[0], composite))
|
|
1003
1025
|
return batch
|
|
1004
1026
|
|
|
1005
1027
|
echo(
|
|
@@ -1027,6 +1049,12 @@ def revalidate_group(
|
|
|
1027
1049
|
else:
|
|
1028
1050
|
batch.culprits.append(label)
|
|
1029
1051
|
echo(f" --revalidate: {label} FAILS alone — {solo.reason}")
|
|
1052
|
+
if solo.kind == KIND_COMPOSE:
|
|
1053
|
+
# #2231: not a verdict problem at all — this branch cannot
|
|
1054
|
+
# merge. Recorded structurally so the caller can dispatch
|
|
1055
|
+
# #241's conflict-fix instead of leaving the entry parked
|
|
1056
|
+
# behind a stale-verdict gate it can never clear.
|
|
1057
|
+
batch.conflicted.append((c, solo))
|
|
1030
1058
|
|
|
1031
1059
|
if not batch.culprits:
|
|
1032
1060
|
# Every branch is green by itself, yet together they are not. That is a
|
|
@@ -1046,6 +1074,36 @@ def revalidate_group(
|
|
|
1046
1074
|
return batch
|
|
1047
1075
|
|
|
1048
1076
|
|
|
1077
|
+
def compose_conflict_error(entry) -> str:
|
|
1078
|
+
"""The ``entry.error`` text for a branch that will not compose (#2231).
|
|
1079
|
+
|
|
1080
|
+
Deliberately worded to be classified correctly by the two consumers that
|
|
1081
|
+
read merge prose rather than structured state:
|
|
1082
|
+
|
|
1083
|
+
* :func:`coord.merge_queue.classify_conflict` must return ``"rebaseable"``
|
|
1084
|
+
— it is what decides whether ``coord merge`` dispatches #241's
|
|
1085
|
+
conflict-fix worker — so the text carries the ``merge conflict`` signal
|
|
1086
|
+
that function already keys on.
|
|
1087
|
+
* :func:`coord.merge_queue.is_stale_smoke_reason` (and ``coord drive``'s
|
|
1088
|
+
``_SMOKE_GATE_MARKERS``) must NOT match, or the driver would read this
|
|
1089
|
+
as the #1738 stale-verdict shape and spend a fix round re-testing a
|
|
1090
|
+
branch that cannot merge — the exact loop #2231 reports. So the stale
|
|
1091
|
+
verdict is *described* here in wording that matches none of
|
|
1092
|
+
:data:`coord.merge_queue.STALE_SMOKE_MARKERS` (this module must not
|
|
1093
|
+
carry a copy of those strings either — see
|
|
1094
|
+
``TestSingleStaleDetector``). ``tests/test_revalidate.py`` asserts both
|
|
1095
|
+
classifications directly, since the wording is load-bearing rather than
|
|
1096
|
+
cosmetic.
|
|
1097
|
+
"""
|
|
1098
|
+
return (
|
|
1099
|
+
f"merge conflict: branch {entry.branch!r} does not compose onto "
|
|
1100
|
+
f"origin/{entry.target_branch} — `git merge` reported a content "
|
|
1101
|
+
"conflict when --revalidate composed it against the current base, so "
|
|
1102
|
+
"no test verdict (fresh or otherwise) can clear this entry until the "
|
|
1103
|
+
"branch is rebased (#2231)"
|
|
1104
|
+
)
|
|
1105
|
+
|
|
1106
|
+
|
|
1049
1107
|
def format_batch(batch: BatchRevalidationResult) -> list[str]:
|
|
1050
1108
|
"""Operator-facing OUTCOME lines for one group's revalidation (#1715).
|
|
1051
1109
|
|
|
@@ -1201,6 +1259,7 @@ __all__ = [
|
|
|
1201
1259
|
"BatchRevalidationResult",
|
|
1202
1260
|
"RevalidationResult",
|
|
1203
1261
|
"client_timeout_seconds",
|
|
1262
|
+
"compose_conflict_error",
|
|
1204
1263
|
"describe_batches",
|
|
1205
1264
|
"describe_candidates",
|
|
1206
1265
|
"format_batch",
|
|
@@ -34,6 +34,19 @@ Three arms have since landed against it:
|
|
|
34
34
|
* **#1738** — `coord drive` re-dispatches the Test stage once, automatically,
|
|
35
35
|
on a STALE (not missing) verdict. Only fires while a **live drive** is
|
|
36
36
|
watching the issue. Measured 2026-08-03: reached 1 of 4 real stalls.
|
|
37
|
+
**#2229** widened what it can see: the arm used to classify the gate from
|
|
38
|
+
the board's `merge_reason` alone, which `merge_queue.plan()` leaves *empty*
|
|
39
|
+
whenever its render-time freshness check has no live SHA data (the #1640
|
|
40
|
+
door / the #1566 "plan says READY, `--only` refuses" split) — so on an
|
|
41
|
+
already-enqueued entry the arm could not arm at all, and the drive spent
|
|
42
|
+
three blind retries and died *printing the refusal it had captured*
|
|
43
|
+
(quadraui#309: 11h blocked on a merge that then landed first try by hand).
|
|
44
|
+
It now falls back to the last `coord merge --only` diagnostic the drive
|
|
45
|
+
itself captured. Still only the STALE arm self-repairs — a *missing*
|
|
46
|
+
verdict is the #1640 lost-write shape and escalates to a human unchanged —
|
|
47
|
+
and, because that diagnostic is a snapshot rather than live state (#2149),
|
|
48
|
+
each capture buys at most one re-test before a real attempt has to
|
|
49
|
+
re-validate it.
|
|
37
50
|
* **#1769** — `coord merge --revalidate` re-tests a stale-but-`passed` entry
|
|
38
51
|
against the current base from the *merge* lane, which is where a branch with
|
|
39
52
|
no live drive actually sits.
|