code-coordinator 0.5.77__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.77 → code_coordinator-0.5.78}/PKG-INFO +1 -1
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/merge.py +68 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/merge_queue.py +107 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/revalidate.py +59 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/OPERATING_GOTCHAS.md +57 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_merge_queue.py +221 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_revalidate.py +271 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.gitignore +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/CLAUDE.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/GOAL.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/LICENSE +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/MANIFEST.in +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/README.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/__init__.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agent.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/audit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/board_service.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/brain.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/claim.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/cli.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/client.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/comments.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/config.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dao.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/db.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deps.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/drive.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/events.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/filelock.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/freshness.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/gates.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/goal.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/context.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/models.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/render.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/units.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/hooks.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/interactive.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/models.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/network.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notify.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/openapi.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/parentage.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/plans.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/progress.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/release_window.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/reports.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/review.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/smoke.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/split_work.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/state.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/test_author.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/test_report.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/usage.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/install-agent.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/pyproject.toml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/setup.cfg +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/__init__.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/conftest.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_config.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_db.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_events.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_init.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_models.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_network.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_session.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_split.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_state.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.77 → 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``
|
|
@@ -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",
|
|
@@ -907,3 +907,60 @@ these figures. Note also that #2132's classification covers 27 rows, not the
|
|
|
907
907
|
38 the original count named — the worker could not reproduce the exact window
|
|
908
908
|
boundary, and cross-validated instead against the `review_iteration=2 → 6 legs`
|
|
909
909
|
figure, which matched exactly. Treat it as representative, not a literal audit.
|
|
910
|
+
|
|
911
|
+
## 18. "test verdict stale" on a branch that no longer merges is the wrong headline — the conflict is (#2231)
|
|
912
|
+
|
|
913
|
+
Gate evaluation is ordered (review → smoke → CI → …) and every gate
|
|
914
|
+
short-circuits. So an entry whose branch does not merge **at all** never
|
|
915
|
+
reaches the merge attempt: it reports `smoke gate — test verdict stale`, which
|
|
916
|
+
invites the one remedy that cannot possibly work, and neither repair mechanism
|
|
917
|
+
can arm behind it —
|
|
918
|
+
|
|
919
|
+
- **#1738**'s stale-smoke auto-repair answers a stale verdict, and the verdict
|
|
920
|
+
was never the problem;
|
|
921
|
+
- **#241**'s `conflict-fix` worker is dispatched by `coord merge` *when the
|
|
922
|
+
merge attempt fails on a rebaseable conflict* — and no merge was attempted.
|
|
923
|
+
|
|
924
|
+
quadraui **#306/#309** sat 11h each in exactly that position (`mergeable:
|
|
925
|
+
false, mergeable_state: dirty`; four sibling driver-test backfills all
|
|
926
|
+
appending to `quadraui/tests/tui_example_driver.rs`, two stranded once the
|
|
927
|
+
first two merged). A human eventually ran `coord fix <aid> --force --guidance
|
|
928
|
+
"<rebase, keep both sides, push --force-with-lease>"` — which is #241's own job
|
|
929
|
+
description.
|
|
930
|
+
|
|
931
|
+
Two things now close that gap, both keyed to a **STALE** verdict specifically
|
|
932
|
+
(a genuinely missing verdict is the #1640 lost-write shape and still escalates
|
|
933
|
+
to a human, unchanged):
|
|
934
|
+
|
|
935
|
+
1. **The smoke gate asks whether the branch merges before it blocks.** When
|
|
936
|
+
the gate is about to refuse on a stale verdict, `merge_queue.
|
|
937
|
+
stale_smoke_conflict_reason` probes `check_pr_mergeable`. A confirmed
|
|
938
|
+
`mergeable: false` turns the refusal into a `conflict` event —
|
|
939
|
+
`entry.state = CONFLICT`, and `_dispatch_conflict_fixes` arms the rebase
|
|
940
|
+
worker exactly as a failed merge attempt would have. `coord merge --plan`
|
|
941
|
+
and the board's `merge_reason` name the conflict too, so `coord drive`
|
|
942
|
+
stops reading the entry as re-testable. An inconclusive probe (`None` —
|
|
943
|
+
GitHub still computing — or a `gh` error, or a caller with no live probe
|
|
944
|
+
at all, e.g. the `/board` read path's `GateSnapshot`) leaves today's
|
|
945
|
+
stale-verdict block exactly as it was.
|
|
946
|
+
2. **`--revalidate` acts on the conflict it finds.** It already composes each
|
|
947
|
+
branch onto the live base in a throwaway worktree, so a `git merge`
|
|
948
|
+
conflict there is a stronger fact than GitHub's `mergeable` field. That
|
|
949
|
+
verdict used to be formatted for the operator and then dropped; it is now
|
|
950
|
+
carried out structurally (`BatchRevalidationResult.conflicted`) and routed
|
|
951
|
+
through the same `_dispatch_conflict_fixes` call. The suite never runs for
|
|
952
|
+
a branch that will not compose, and no verdict is rewritten.
|
|
953
|
+
|
|
954
|
+
What you should see instead of an 11-hour park:
|
|
955
|
+
|
|
956
|
+
```
|
|
957
|
+
--revalidate: api #102: the blocker is a CONFLICT, not a stale verdict — the
|
|
958
|
+
branch does not compose onto its base. Routing to the conflict-fix path
|
|
959
|
+
(#241) instead of re-testing (#2231).
|
|
960
|
+
api #102: conflict-fix dispatched to laptop
|
|
961
|
+
```
|
|
962
|
+
|
|
963
|
+
If the conflict-fix worker itself fails, the #241/#784 retry cap still flips
|
|
964
|
+
the entry to `HUMAN_REQUIRED` on the second attempt — rule #10's escape hatch
|
|
965
|
+
applies from there. Nothing here loosens that: this only removes the case
|
|
966
|
+
where **no** mechanism ran at all.
|
|
@@ -8252,3 +8252,224 @@ class TestAbandonedRunningMarkerIsStaleNotMissing:
|
|
|
8252
8252
|
candidates = mq.revalidation_candidates([entry], board, _Cfg())
|
|
8253
8253
|
|
|
8254
8254
|
assert [c.work_assignment_id for c in candidates] == ["w1"]
|
|
8255
|
+
|
|
8256
|
+
|
|
8257
|
+
# ══════════════════════════════════════════════════════════════════════════════
|
|
8258
|
+
# #2231: a conflict hiding behind a stale-verdict smoke block
|
|
8259
|
+
# ══════════════════════════════════════════════════════════════════════════════
|
|
8260
|
+
|
|
8261
|
+
class TestStaleSmokeConflictProbe:
|
|
8262
|
+
"""#2231: gate evaluation short-circuits on the smoke gate, so an entry
|
|
8263
|
+
whose branch does not merge AT ALL reports "test verdict stale" — the one
|
|
8264
|
+
remedy that cannot work — and never reaches the merge attempt that would
|
|
8265
|
+
have armed #241's conflict-fix.
|
|
8266
|
+
|
|
8267
|
+
quadraui #306/#309 sat 11h each in exactly that position: `mergeable:
|
|
8268
|
+
false, mergeable_state: dirty`, four sibling branches appending to one
|
|
8269
|
+
file, two of them stranded once the first two merged. `--revalidate`
|
|
8270
|
+
diagnosed it perfectly and nothing acted; a human finally typed `coord fix
|
|
8271
|
+
--force`, which is #241's own job description.
|
|
8272
|
+
"""
|
|
8273
|
+
|
|
8274
|
+
@staticmethod
|
|
8275
|
+
def _config():
|
|
8276
|
+
return TestSmokeGate._config()
|
|
8277
|
+
|
|
8278
|
+
@staticmethod
|
|
8279
|
+
def _stale_setup(*, mergeable: bool | None):
|
|
8280
|
+
"""One PENDING entry whose passed verdict was staled by a base move,
|
|
8281
|
+
plus a `gh` stub with a definite answer about mergeability."""
|
|
8282
|
+
work = TestSmokeGate._work("w1", test_state="passed")
|
|
8283
|
+
work.test_head_sha = "branch-sha-1"
|
|
8284
|
+
work.test_patch_id = "patch-1"
|
|
8285
|
+
work.test_base_sha = "main-sha-old"
|
|
8286
|
+
board = TestSmokeGate._board(completed=[work])
|
|
8287
|
+
|
|
8288
|
+
entry = _q("w1", size=10, pr=100)
|
|
8289
|
+
entry.branch_head_sha = "branch-sha-1"
|
|
8290
|
+
entry.branch_patch_id = "patch-1"
|
|
8291
|
+
entry.target_branch_head_sha = "main-sha-new" # base moved under it
|
|
8292
|
+
gh = FakeGh(mergeable_results={100: mergeable})
|
|
8293
|
+
return entry, board, gh
|
|
8294
|
+
|
|
8295
|
+
# ── the predicate ──
|
|
8296
|
+
|
|
8297
|
+
def test_reason_names_the_conflict_when_github_says_not_mergeable(self) -> None:
|
|
8298
|
+
entry, board, gh = self._stale_setup(mergeable=False)
|
|
8299
|
+
smoke = mq.evaluate_smoke_verdict(entry, board)
|
|
8300
|
+
assert smoke.kind == mq.SMOKE_STALE
|
|
8301
|
+
|
|
8302
|
+
reason = mq.stale_smoke_conflict_reason(entry, smoke, gh)
|
|
8303
|
+
|
|
8304
|
+
assert reason is not None
|
|
8305
|
+
# The conflict leads; the stale verdict is named as downstream, not as
|
|
8306
|
+
# the blocker (the acceptance criterion's "not (only) a stale verdict").
|
|
8307
|
+
assert "merge conflict" in reason.lower()
|
|
8308
|
+
assert "test verdict" in reason.lower()
|
|
8309
|
+
|
|
8310
|
+
def test_reason_classifies_as_rebaseable_and_not_as_stale_smoke(self) -> None:
|
|
8311
|
+
"""The wording is load-bearing in both directions: `classify_conflict`
|
|
8312
|
+
decides whether #241 dispatches, and `is_stale_smoke_reason` decides
|
|
8313
|
+
whether `coord drive` answers with a re-test. Getting either wrong
|
|
8314
|
+
reproduces the bug with extra steps."""
|
|
8315
|
+
entry, board, gh = self._stale_setup(mergeable=False)
|
|
8316
|
+
reason = mq.stale_smoke_conflict_reason(
|
|
8317
|
+
entry, mq.evaluate_smoke_verdict(entry, board), gh,
|
|
8318
|
+
)
|
|
8319
|
+
|
|
8320
|
+
assert mq.classify_conflict(reason) == "rebaseable"
|
|
8321
|
+
assert mq.is_stale_smoke_reason(reason) is False
|
|
8322
|
+
|
|
8323
|
+
def test_silent_when_the_pr_is_mergeable(self) -> None:
|
|
8324
|
+
"""Acceptance: a genuinely stale verdict on a cleanly-composing branch
|
|
8325
|
+
still takes the #1738 path, unchanged."""
|
|
8326
|
+
entry, board, gh = self._stale_setup(mergeable=True)
|
|
8327
|
+
assert mq.stale_smoke_conflict_reason(
|
|
8328
|
+
entry, mq.evaluate_smoke_verdict(entry, board), gh,
|
|
8329
|
+
) is None
|
|
8330
|
+
|
|
8331
|
+
def test_silent_when_mergeability_is_still_computing(self) -> None:
|
|
8332
|
+
"""`None` is "GitHub hasn't decided", not "conflict". Upgrading an
|
|
8333
|
+
inconclusive read would point a rebase worker at a clean branch."""
|
|
8334
|
+
entry, board, gh = self._stale_setup(mergeable=None)
|
|
8335
|
+
assert mq.stale_smoke_conflict_reason(
|
|
8336
|
+
entry, mq.evaluate_smoke_verdict(entry, board), gh,
|
|
8337
|
+
) is None
|
|
8338
|
+
|
|
8339
|
+
def test_silent_when_the_probe_raises(self) -> None:
|
|
8340
|
+
entry, board, _gh = self._stale_setup(mergeable=False)
|
|
8341
|
+
|
|
8342
|
+
class _Boom:
|
|
8343
|
+
def check_pr_mergeable(self, repo, number):
|
|
8344
|
+
raise RuntimeError("gh exploded")
|
|
8345
|
+
|
|
8346
|
+
assert mq.stale_smoke_conflict_reason(
|
|
8347
|
+
entry, mq.evaluate_smoke_verdict(entry, board), _Boom(),
|
|
8348
|
+
) is None
|
|
8349
|
+
|
|
8350
|
+
def test_silent_without_a_probe_at_all(self) -> None:
|
|
8351
|
+
"""The `/board` read path evaluates gates against a GateSnapshot, which
|
|
8352
|
+
implements no `gh` calls (#1336 Invariant 1). Duck-typed, like the
|
|
8353
|
+
#1877 CI-absent branch."""
|
|
8354
|
+
entry, board, _gh = self._stale_setup(mergeable=False)
|
|
8355
|
+
|
|
8356
|
+
class _NoProbe:
|
|
8357
|
+
pass
|
|
8358
|
+
|
|
8359
|
+
assert mq.stale_smoke_conflict_reason(
|
|
8360
|
+
entry, mq.evaluate_smoke_verdict(entry, board), _NoProbe(),
|
|
8361
|
+
) is None
|
|
8362
|
+
|
|
8363
|
+
def test_silent_for_a_missing_verdict(self) -> None:
|
|
8364
|
+
"""SMOKE_MISSING is the #1640 lost-write shape and stays out of scope,
|
|
8365
|
+
exactly as it is for `revalidation_candidates`."""
|
|
8366
|
+
work = TestSmokeGate._work("w1", test_state=None)
|
|
8367
|
+
board = TestSmokeGate._board(completed=[work])
|
|
8368
|
+
entry = _q("w1", pr=100)
|
|
8369
|
+
smoke = mq.evaluate_smoke_verdict(entry, board)
|
|
8370
|
+
|
|
8371
|
+
assert smoke.kind == mq.SMOKE_MISSING
|
|
8372
|
+
assert mq.stale_smoke_conflict_reason(
|
|
8373
|
+
entry, smoke, FakeGh(mergeable_results={100: False}),
|
|
8374
|
+
) is None
|
|
8375
|
+
|
|
8376
|
+
def test_silent_before_a_pr_exists(self) -> None:
|
|
8377
|
+
entry, board, gh = self._stale_setup(mergeable=False)
|
|
8378
|
+
entry.pr_number = None
|
|
8379
|
+
assert mq.stale_smoke_conflict_reason(
|
|
8380
|
+
entry, mq.evaluate_smoke_verdict(entry, board), gh,
|
|
8381
|
+
) is None
|
|
8382
|
+
|
|
8383
|
+
# ── process(): the event that arms #241 ──
|
|
8384
|
+
|
|
8385
|
+
def test_process_emits_a_conflict_event_not_smoke_required(self) -> None:
|
|
8386
|
+
"""The headline: the entry that used to park at PENDING/"stale" now
|
|
8387
|
+
parks at CONFLICT with a `conflict` event — which is precisely what
|
|
8388
|
+
`coord.commands.merge._dispatch_conflict_fixes` consumes."""
|
|
8389
|
+
entry, board, gh = self._stale_setup(mergeable=False)
|
|
8390
|
+
events = process([entry], gh, config=self._config(), board=board)
|
|
8391
|
+
|
|
8392
|
+
kinds = [e.kind for e in events]
|
|
8393
|
+
assert "conflict" in kinds
|
|
8394
|
+
assert "smoke_required" not in kinds
|
|
8395
|
+
assert "merged" not in kinds
|
|
8396
|
+
assert gh.merge_calls == []
|
|
8397
|
+
assert entry.state == CONFLICT
|
|
8398
|
+
assert mq.classify_conflict(entry.error) == "rebaseable"
|
|
8399
|
+
|
|
8400
|
+
def test_process_still_blocks_on_smoke_when_the_branch_is_clean(self) -> None:
|
|
8401
|
+
entry, board, gh = self._stale_setup(mergeable=True)
|
|
8402
|
+
events = process([entry], gh, config=self._config(), board=board)
|
|
8403
|
+
|
|
8404
|
+
kinds = [e.kind for e in events]
|
|
8405
|
+
assert "smoke_required" in kinds
|
|
8406
|
+
assert "conflict" not in kinds
|
|
8407
|
+
assert entry.state == PENDING
|
|
8408
|
+
assert mq.is_stale_smoke_reason(entry.error) is True
|
|
8409
|
+
|
|
8410
|
+
def test_process_unchanged_when_gh_reports_nothing(self) -> None:
|
|
8411
|
+
"""Every pre-#2231 test uses a `gh` stub whose `check_pr_mergeable`
|
|
8412
|
+
answers `None`; none of them may change behaviour."""
|
|
8413
|
+
entry, board, _gh = self._stale_setup(mergeable=None)
|
|
8414
|
+
events = process([entry], FakeGh(), config=self._config(), board=board)
|
|
8415
|
+
|
|
8416
|
+
assert [e.kind for e in events].count("smoke_required") == 1
|
|
8417
|
+
assert entry.state == PENDING
|
|
8418
|
+
|
|
8419
|
+
# ── process(dry_run=True): the preview must not disagree with --plan ──
|
|
8420
|
+
|
|
8421
|
+
def test_dry_run_reports_conflict_not_smoke_required(self) -> None:
|
|
8422
|
+
"""Review finding on iteration 1: the smoke gate's own `--dry-run`
|
|
8423
|
+
preview block sat right next to the CI gate's #1877 dry-run conflict
|
|
8424
|
+
check but wasn't updated for #2231, so `coord merge --dry-run`
|
|
8425
|
+
(without `--revalidate`) kept printing the stale-verdict headline for
|
|
8426
|
+
an entry `--plan`/a real run both correctly report as `conflict` —
|
|
8427
|
+
the exact "two surfaces answer the same question differently"
|
|
8428
|
+
split-brain this issue exists to fix."""
|
|
8429
|
+
entry, board, gh = self._stale_setup(mergeable=False)
|
|
8430
|
+
events = process([entry], gh, config=self._config(), board=board, dry_run=True)
|
|
8431
|
+
|
|
8432
|
+
kinds = [e.kind for e in events]
|
|
8433
|
+
assert "conflict" in kinds
|
|
8434
|
+
assert "smoke_required" not in kinds
|
|
8435
|
+
assert gh.merge_calls == []
|
|
8436
|
+
# dry-run never mutates state
|
|
8437
|
+
assert entry.state == PENDING
|
|
8438
|
+
conflict_event = next(e for e in events if e.kind == "conflict")
|
|
8439
|
+
assert mq.classify_conflict(conflict_event.message) == "rebaseable"
|
|
8440
|
+
|
|
8441
|
+
def test_dry_run_still_shows_smoke_required_when_the_branch_is_clean(self) -> None:
|
|
8442
|
+
"""Acceptance: a genuinely stale verdict on a cleanly-composing
|
|
8443
|
+
branch still takes the #1738 path, unchanged — including in the
|
|
8444
|
+
dry-run preview."""
|
|
8445
|
+
entry, board, gh = self._stale_setup(mergeable=True)
|
|
8446
|
+
events = process([entry], gh, config=self._config(), board=board, dry_run=True)
|
|
8447
|
+
|
|
8448
|
+
kinds = [e.kind for e in events]
|
|
8449
|
+
assert "smoke_required" in kinds
|
|
8450
|
+
assert "conflict" not in kinds
|
|
8451
|
+
assert entry.state == PENDING
|
|
8452
|
+
|
|
8453
|
+
# ── _entry_gate_status(): what the plan/board reports ──
|
|
8454
|
+
|
|
8455
|
+
def test_plan_reason_names_the_conflict(self) -> None:
|
|
8456
|
+
"""Acceptance: "An entry whose branch does not compose onto its base
|
|
8457
|
+
reports conflict as its blocking reason, not (only) a stale verdict."
|
|
8458
|
+
"""
|
|
8459
|
+
entry, board, gh = self._stale_setup(mergeable=False)
|
|
8460
|
+
status, reason = mq.entry_gate_status(
|
|
8461
|
+
entry, board, self._config(), None, gh,
|
|
8462
|
+
)
|
|
8463
|
+
|
|
8464
|
+
assert status == mq.PLAN_BLOCKED
|
|
8465
|
+
assert "merge conflict" in reason.lower()
|
|
8466
|
+
assert mq.is_stale_smoke_reason(reason) is False
|
|
8467
|
+
|
|
8468
|
+
def test_plan_reason_unchanged_for_a_clean_branch(self) -> None:
|
|
8469
|
+
entry, board, gh = self._stale_setup(mergeable=True)
|
|
8470
|
+
status, reason = mq.entry_gate_status(
|
|
8471
|
+
entry, board, self._config(), None, gh,
|
|
8472
|
+
)
|
|
8473
|
+
|
|
8474
|
+
assert status == mq.PLAN_BLOCKED
|
|
8475
|
+
assert mq.is_stale_smoke_reason(reason) is True
|