code-coordinator 0.5.170__tar.gz → 0.5.171__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.170 → code_coordinator-0.5.171}/PKG-INFO +1 -1
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/fixture.py +17 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/server.py +125 -2
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/api/generated.ts +37 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/drive_queue.py +124 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/openapi.py +2 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/board-pipeline-basic.json +52 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_dashboard.py +139 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_dashboard_fixture.py +50 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.github/workflows/acceptance-web.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/.gitignore +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/CLAUDE.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/GOAL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/LICENSE +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/MANIFEST.in +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/README.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/__init__.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/agent.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/audit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/block_log.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/board_service.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/brain.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/claim.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/cli.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/client.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/comments.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/config.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dao.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/db.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/deps.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/drive.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/events.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/filelock.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/freshness.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/gates.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/goal.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/context.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/models.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/render.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/health/units.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/hooks.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/interactive.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/models.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/network.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/notify.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/parentage.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/plans.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/progress.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/release_window.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/reports.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/review.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/self_health.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/smoke.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/split_work.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/state.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/test_author.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/test_report.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/usage.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/install-agent.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/pyproject.toml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/setup.cfg +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/__init__.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/conftest.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_config.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_db.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_events.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_init.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_models.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_network.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_review.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_session.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_split.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_state.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.170 → code_coordinator-0.5.171}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -35,6 +35,7 @@ Fixture schema (every key optional except ``board``)::
|
|
|
35
35
|
"proposals": [ {...coord.models.Proposal fields...} ],
|
|
36
36
|
"machines": [ {...GET /api/machines entry...} ],
|
|
37
37
|
"sessions": [ {...GET /api/sessions entry...} ],
|
|
38
|
+
"drive_queue": [ {...coord.state._decode_drive_queue_row shape...} ],
|
|
38
39
|
"review_findings": {"rev-1": {"verdict": "approve", "body": "..."}},
|
|
39
40
|
"diffs": {"work-1": "diff --git ..."},
|
|
40
41
|
"chat_reply": "canned /api/chat response text",
|
|
@@ -154,6 +155,7 @@ class FixtureServer:
|
|
|
154
155
|
proposals_raw: list = field(default_factory=list)
|
|
155
156
|
machines_raw: list = field(default_factory=list)
|
|
156
157
|
sessions_raw: list = field(default_factory=list)
|
|
158
|
+
drive_queue_raw: list = field(default_factory=list)
|
|
157
159
|
review_findings_raw: dict = field(default_factory=dict)
|
|
158
160
|
diffs: dict = field(default_factory=dict)
|
|
159
161
|
chat_reply: str = "fixture mode: the coordinator assistant is not wired up."
|
|
@@ -194,6 +196,20 @@ class FixtureServer:
|
|
|
194
196
|
def sessions(self) -> list[dict]:
|
|
195
197
|
return copy.deepcopy(self.sessions_raw)
|
|
196
198
|
|
|
199
|
+
def drive_queue(self, repo_name: str | None = None) -> list[dict]:
|
|
200
|
+
"""The seeded `coord drive` queue rows (#2428 DQW-1).
|
|
201
|
+
|
|
202
|
+
Same raw-row shape ``GET /api/drive-queue`` serves off the real DB
|
|
203
|
+
(``coord.state._decode_drive_queue_row``) — no reshaping, so a
|
|
204
|
+
fixture captured from a live queue (or hand-written to that shape)
|
|
205
|
+
drops in unchanged. ``repo_name`` filters exactly like
|
|
206
|
+
``coord.state._list_drive_queue_local``'s ``WHERE repo_name = ?``.
|
|
207
|
+
"""
|
|
208
|
+
rows = copy.deepcopy(self.drive_queue_raw)
|
|
209
|
+
if repo_name:
|
|
210
|
+
rows = [r for r in rows if r.get("repo_name") == repo_name]
|
|
211
|
+
return rows
|
|
212
|
+
|
|
197
213
|
def review_findings(self, assignment_id: str) -> tuple[str, str] | None:
|
|
198
214
|
"""Stand-in for ``coord.state.load_assignment_review_findings``.
|
|
199
215
|
|
|
@@ -343,6 +359,7 @@ def parse_fixture(raw: Any, *, path: Path | None = None) -> FixtureServer:
|
|
|
343
359
|
proposals_raw=_as_list(raw.get("proposals"), "proposals"),
|
|
344
360
|
machines_raw=_as_list(raw.get("machines"), "machines"),
|
|
345
361
|
sessions_raw=_as_list(raw.get("sessions"), "sessions"),
|
|
362
|
+
drive_queue_raw=_as_list(raw.get("drive_queue"), "drive_queue"),
|
|
346
363
|
review_findings_raw=_as_dict(raw.get("review_findings"), "review_findings"),
|
|
347
364
|
diffs=diffs,
|
|
348
365
|
events=_parse_events(raw.get("events")),
|
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import json
|
|
7
|
+
import sqlite3
|
|
7
8
|
import subprocess
|
|
8
9
|
import time
|
|
9
10
|
from concurrent.futures import ThreadPoolExecutor
|
|
@@ -34,11 +35,19 @@ from coord.events import (
|
|
|
34
35
|
build_events_route,
|
|
35
36
|
)
|
|
36
37
|
from coord.board_service import read_board, write_board
|
|
38
|
+
from coord.dao import _JSON_COLUMNS
|
|
39
|
+
from coord.db import _ensure_schema
|
|
40
|
+
from coord.drive_queue import DriveQueueSummary, entries_from_rows, summarize_drive_queue
|
|
37
41
|
from coord.models import Assignment
|
|
38
42
|
from coord.network import check_all, fetch_status
|
|
39
|
-
from coord.openapi import
|
|
43
|
+
from coord.openapi import (
|
|
44
|
+
build_spec,
|
|
45
|
+
dataclass_schema,
|
|
46
|
+
openapi_and_docs_routes,
|
|
47
|
+
sqlite_table_schema,
|
|
48
|
+
)
|
|
40
49
|
from coord.pipeline import PipelineView
|
|
41
|
-
from coord.state import load_proposals
|
|
50
|
+
from coord.state import list_drive_queue, load_proposals
|
|
42
51
|
|
|
43
52
|
DASHBOARD_DIR = Path(__file__).parent
|
|
44
53
|
# Built React webapp lives here after `npm run build` inside coord/dashboard/webapp/.
|
|
@@ -317,6 +326,35 @@ def openapi_spec() -> dict:
|
|
|
317
326
|
components: dict = {}
|
|
318
327
|
assignment_ref = dataclass_schema(Assignment, components)
|
|
319
328
|
pipeline_view_ref = dataclass_schema(PipelineView, components)
|
|
329
|
+
# #2428 DQW-1: the drive-queue entry schema comes straight from the
|
|
330
|
+
# SQLite DDL, the same way coord/serve_app.py's `_board_response_schema`
|
|
331
|
+
# builds `BoardDriveQueueEntry` for `/board` — the wire schema *is* the
|
|
332
|
+
# DDL (coord/db.py), not a hand-maintained field list that can drift from
|
|
333
|
+
# it. `after_json` is JSON-encoded TEXT in SQLite, decoded to an array on
|
|
334
|
+
# the wire — the JSON columns come from `coord.dao._JSON_COLUMNS` itself
|
|
335
|
+
# (the same source `coord/serve_app.py`'s `_board_response_schema` derives
|
|
336
|
+
# its own `frozenset(_JSON_COLUMNS.get(table, ()))` from) rather than a
|
|
337
|
+
# second hand-maintained literal, so a future JSON column on `drive_queue`
|
|
338
|
+
# only needs updating in one place (#2096).
|
|
339
|
+
_schema_conn = sqlite3.connect(":memory:")
|
|
340
|
+
try:
|
|
341
|
+
_ensure_schema(_schema_conn)
|
|
342
|
+
components["BoardDriveQueueEntry"] = sqlite_table_schema(
|
|
343
|
+
_schema_conn,
|
|
344
|
+
"drive_queue",
|
|
345
|
+
json_columns=frozenset(_JSON_COLUMNS.get("drive_queue", ())),
|
|
346
|
+
)
|
|
347
|
+
finally:
|
|
348
|
+
_schema_conn.close()
|
|
349
|
+
drive_queue_entry_ref = {"$ref": "#/components/schemas/BoardDriveQueueEntry"}
|
|
350
|
+
drive_queue_summary_ref = dataclass_schema(DriveQueueSummary, components)
|
|
351
|
+
drive_queue_response = {
|
|
352
|
+
"type": "object",
|
|
353
|
+
"properties": {
|
|
354
|
+
"entries": {"type": "array", "items": drive_queue_entry_ref},
|
|
355
|
+
"summary": drive_queue_summary_ref,
|
|
356
|
+
},
|
|
357
|
+
}
|
|
320
358
|
board_response = {
|
|
321
359
|
"type": "object",
|
|
322
360
|
"properties": {
|
|
@@ -372,6 +410,37 @@ def openapi_spec() -> dict:
|
|
|
372
410
|
"responses": {"200": {"description": "OK"}},
|
|
373
411
|
}
|
|
374
412
|
},
|
|
413
|
+
"/api/drive-queue": {
|
|
414
|
+
"get": {
|
|
415
|
+
"summary": (
|
|
416
|
+
"The `coord drive` work queue in run order, plus a "
|
|
417
|
+
"server-computed pending/running/waiting/eligible/"
|
|
418
|
+
"blocked/held summary (#2428 DQW-1)"
|
|
419
|
+
),
|
|
420
|
+
"parameters": [
|
|
421
|
+
{
|
|
422
|
+
"name": "repo",
|
|
423
|
+
"in": "query",
|
|
424
|
+
"required": False,
|
|
425
|
+
"schema": {"type": "string"},
|
|
426
|
+
"description": (
|
|
427
|
+
"Restrict `entries` to one repo. `summary` is always "
|
|
428
|
+
"computed over the FULL queue, whatever `repo` is set "
|
|
429
|
+
"to — `fleet_held`/`level` are fleet-wide facts (a "
|
|
430
|
+
"fleet-scoped fired deploy gate anywhere stops the "
|
|
431
|
+
"whole tick), so narrowing the summary to one repo "
|
|
432
|
+
"could misreport it as clear."
|
|
433
|
+
),
|
|
434
|
+
}
|
|
435
|
+
],
|
|
436
|
+
"responses": {
|
|
437
|
+
"200": {
|
|
438
|
+
"description": "OK",
|
|
439
|
+
"content": {"application/json": {"schema": drive_queue_response}},
|
|
440
|
+
}
|
|
441
|
+
},
|
|
442
|
+
}
|
|
443
|
+
},
|
|
375
444
|
"/api/approve": {
|
|
376
445
|
"post": {
|
|
377
446
|
"summary": "Dispatch one or more proposals by id",
|
|
@@ -624,6 +693,19 @@ def build_app(
|
|
|
624
693
|
return
|
|
625
694
|
write_board(board)
|
|
626
695
|
|
|
696
|
+
def _read_drive_queue() -> list[dict]:
|
|
697
|
+
"""Every drive-queue row — seeded fixture or the daemon/local DB (#2428).
|
|
698
|
+
|
|
699
|
+
ALWAYS the full, unfiltered queue, same as ``_read_board()`` for the
|
|
700
|
+
board: ``?repo=`` is applied by ``api_drive_queue`` itself, to the
|
|
701
|
+
response's ``entries`` list only, AFTER this. That is deliberate, not
|
|
702
|
+
an oversight — see ``api_drive_queue``'s docstring for why the
|
|
703
|
+
aggregate summary must never be computed over a repo-filtered subset.
|
|
704
|
+
"""
|
|
705
|
+
if _fixture is not None:
|
|
706
|
+
return _fixture.drive_queue()
|
|
707
|
+
return list_drive_queue()
|
|
708
|
+
|
|
627
709
|
# ── Real-time event bus ────────────────────────────────────────────────
|
|
628
710
|
event_source = EventSource()
|
|
629
711
|
|
|
@@ -902,6 +984,46 @@ def build_app(
|
|
|
902
984
|
from dataclasses import asdict
|
|
903
985
|
return JSONResponse([asdict(p) for p in proposals])
|
|
904
986
|
|
|
987
|
+
async def api_drive_queue(request: Request) -> JSONResponse:
|
|
988
|
+
"""GET /api/drive-queue?repo= — the operator-declared `coord drive`
|
|
989
|
+
work queue, plus a server-computed aggregate summary (#2428 DQW-1).
|
|
990
|
+
|
|
991
|
+
Mirrors ``api_board``'s shape via ``_read_drive_queue()`` (the fixture-
|
|
992
|
+
vs-live indirection every other handler in this file goes through —
|
|
993
|
+
see ``_read_board()``), which resolves daemon-vs-local exactly like
|
|
994
|
+
``coord drive-queue list`` itself does. ``entries`` is the raw row
|
|
995
|
+
list — optionally narrowed to ``?repo=`` — verbatim: same shape as the
|
|
996
|
+
daemon's own ``GET /drive-queue`` and ``/board``'s ``drive_queue``
|
|
997
|
+
field, no reshaping, no new fields.
|
|
998
|
+
|
|
999
|
+
``summary`` (:func:`coord.drive_queue.summarize_drive_queue`) is
|
|
1000
|
+
DELIBERATELY computed over the FULL, unfiltered queue, never the
|
|
1001
|
+
``?repo=``-narrowed one — even though only ``entries`` respects the
|
|
1002
|
+
filter. This mirrors the summary's one existing call site
|
|
1003
|
+
(``tui/src/app/mod.rs``'s ``summarize_drive_queue(&self.data.drive_queue)``,
|
|
1004
|
+
always the whole board queue) and is required for correctness, not
|
|
1005
|
+
just consistency: ``fleet_held``/``level == "held"`` is documented as
|
|
1006
|
+
"a non-zero fleet-scoped fired gate stops the tick from launching
|
|
1007
|
+
ANYTHING, whatever repo it's in", and ``summarize_drive_queue``'s
|
|
1008
|
+
``after=`` satisfaction check (``_after_satisfied``) treats a pre-req
|
|
1009
|
+
absent from the entries it's given as already satisfied ("it may have
|
|
1010
|
+
landed long ago"). Summarizing only the filtered subset would let
|
|
1011
|
+
``GET /api/drive-queue?repo=web`` report ``level: "normal"`` while a
|
|
1012
|
+
DIFFERENT repo's entry actually holds the whole fleet queue, and could
|
|
1013
|
+
count a cross-repo ``after=`` dependency as eligible when the real
|
|
1014
|
+
prerequisite is still pending, just filtered out of view. So the
|
|
1015
|
+
Queue panel sidebar's pending/running/waiting/eligible/blocked/held
|
|
1016
|
+
counts are always fleet-wide, exactly like the TUI's; only the visible
|
|
1017
|
+
row list narrows with ``?repo=``.
|
|
1018
|
+
"""
|
|
1019
|
+
from dataclasses import asdict
|
|
1020
|
+
|
|
1021
|
+
repo = request.query_params.get("repo") or None
|
|
1022
|
+
rows = _read_drive_queue()
|
|
1023
|
+
summary = summarize_drive_queue(entries_from_rows(rows))
|
|
1024
|
+
entries = [r for r in rows if r.get("repo_name") == repo] if repo else rows
|
|
1025
|
+
return JSONResponse({"entries": entries, "summary": asdict(summary)})
|
|
1026
|
+
|
|
905
1027
|
async def api_approve(request: Request) -> JSONResponse:
|
|
906
1028
|
from coord.dispatch import dispatch, post_briefing, compute_do_not_touch
|
|
907
1029
|
from coord.state import (
|
|
@@ -1821,6 +1943,7 @@ def build_app(
|
|
|
1821
1943
|
Route("/api/machines", api_machines, methods=["GET"]),
|
|
1822
1944
|
Route("/api/sessions", api_sessions, methods=["GET"]),
|
|
1823
1945
|
Route("/api/proposals", api_proposals, methods=["GET"]),
|
|
1946
|
+
Route("/api/drive-queue", api_drive_queue, methods=["GET"]),
|
|
1824
1947
|
Route("/api/approve", api_approve, methods=["POST"]),
|
|
1825
1948
|
Route("/api/reject", api_reject, methods=["POST"]),
|
|
1826
1949
|
Route("/api/diff/{id}", api_diff, methods=["GET"]),
|
{code_coordinator-0.5.170 → code_coordinator-0.5.171}/coord/dashboard/webapp/src/api/generated.ts
RENAMED
|
@@ -176,3 +176,40 @@ export interface Assignment {
|
|
|
176
176
|
stop_reason: string | null
|
|
177
177
|
dispatched_by_assignment_id: string | null
|
|
178
178
|
}
|
|
179
|
+
|
|
180
|
+
export interface BoardDriveQueueEntry {
|
|
181
|
+
id: number | null
|
|
182
|
+
repo_name: string
|
|
183
|
+
issue_number: number
|
|
184
|
+
position: number
|
|
185
|
+
machine: string | null
|
|
186
|
+
after_json: string[]
|
|
187
|
+
state: string
|
|
188
|
+
attempts: number
|
|
189
|
+
deferrals: number
|
|
190
|
+
last_reason: string
|
|
191
|
+
reason_at: number | null
|
|
192
|
+
session_name: string | null
|
|
193
|
+
launched_at: number | null
|
|
194
|
+
enqueued_at: number
|
|
195
|
+
hold_after: number
|
|
196
|
+
hold_reason: string
|
|
197
|
+
resume_when: string
|
|
198
|
+
hold_state: string
|
|
199
|
+
hold_probes: number
|
|
200
|
+
launch_host: string
|
|
201
|
+
hold_scope: string
|
|
202
|
+
resumes: number
|
|
203
|
+
retry_backoff_at: number | null
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export interface DriveQueueSummary {
|
|
207
|
+
level: string
|
|
208
|
+
pending: number
|
|
209
|
+
running: number
|
|
210
|
+
waiting: number
|
|
211
|
+
blocked: number
|
|
212
|
+
eligible: number
|
|
213
|
+
held: number
|
|
214
|
+
fleet_held: number
|
|
215
|
+
}
|
|
@@ -722,6 +722,130 @@ def entries_from_rows(rows: Iterable[Mapping[str, Any]]) -> list[QueueEntry]:
|
|
|
722
722
|
)
|
|
723
723
|
|
|
724
724
|
|
|
725
|
+
# ── aggregate summary (#2428 DQW-1) ───────────────────────────────────────────
|
|
726
|
+
#
|
|
727
|
+
# Ported field-for-field from `tui/src/app/drive_queue.rs`'s
|
|
728
|
+
# `summarize_drive_queue`/`DriveQueueSummary` — see that module's own comments
|
|
729
|
+
# for the #2186 incident behind "blocked outranks a fleet-held gate, which
|
|
730
|
+
# outranks a stall" and for why `fleet_held` (not `held`) is what actually
|
|
731
|
+
# stops the queue. Kept here, next to `entries_from_rows`, rather than in
|
|
732
|
+
# `coord/dashboard/server.py`, so any future consumer (a CLI summary, another
|
|
733
|
+
# server) gets the exact same counts without re-deriving them.
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
def _entry_is_pending(entry: QueueEntry) -> bool:
|
|
737
|
+
"""Rows that still have work ahead — `done` entries are history."""
|
|
738
|
+
return entry.state != STATE_DONE
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
def _entry_is_holding(entry: QueueEntry) -> bool:
|
|
742
|
+
"""Is this row's OWN deploy gate currently fired? Scope-agnostic."""
|
|
743
|
+
return entry.hold_state == HOLD_FIRED
|
|
744
|
+
|
|
745
|
+
|
|
746
|
+
def _entry_stops_fleet(entry: QueueEntry) -> bool:
|
|
747
|
+
"""Does this row's fired gate stop the WHOLE queue (#2186)?"""
|
|
748
|
+
return _entry_is_holding(entry) and entry.hold_scope == HOLD_SCOPE_FLEET
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
def _after_satisfied(entry: QueueEntry, all_entries: Sequence[QueueEntry]) -> bool:
|
|
752
|
+
"""Is *entry*'s `after=` list satisfied by the queue it sits in?
|
|
753
|
+
|
|
754
|
+
Same conservative, local read as the Rust original: a pre-req not
|
|
755
|
+
present in *all_entries* at all is treated as satisfied (it may have
|
|
756
|
+
landed long ago); a pre-req whose OWN gate has fired is unsatisfied even
|
|
757
|
+
though its row has by then reconciled to `done`.
|
|
758
|
+
"""
|
|
759
|
+
for key in entry.after:
|
|
760
|
+
unsatisfied = any(
|
|
761
|
+
other.key == key
|
|
762
|
+
and (other.state != STATE_DONE or _entry_is_holding(other))
|
|
763
|
+
for other in all_entries
|
|
764
|
+
)
|
|
765
|
+
if unsatisfied:
|
|
766
|
+
return False
|
|
767
|
+
return True
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
@dataclass(frozen=True)
|
|
771
|
+
class DriveQueueSummary:
|
|
772
|
+
"""Aggregate reading over a whole (or `?repo=`-filtered) queue read.
|
|
773
|
+
|
|
774
|
+
``level`` is the same ascending-severity rank
|
|
775
|
+
`tui/src/app/drive_queue.rs::DriveQueueLevel` computes — `"empty"` <
|
|
776
|
+
`"normal"` < `"stalled"` < `"held"` < `"blocked"` — so a client can badge
|
|
777
|
+
the panel sidebar without re-deriving the ranking rule.
|
|
778
|
+
"""
|
|
779
|
+
|
|
780
|
+
level: str = "empty"
|
|
781
|
+
# #2428: total non-`done` rows — the Rust original never materializes
|
|
782
|
+
# this as a struct field (it's implicit in the loop's filter), but a web
|
|
783
|
+
# sidebar wants a single "N pending" headline as much as it wants the
|
|
784
|
+
# breakdown, so it is added here rather than left for the client to sum.
|
|
785
|
+
pending: int = 0
|
|
786
|
+
running: int = 0
|
|
787
|
+
waiting: int = 0
|
|
788
|
+
blocked: int = 0
|
|
789
|
+
# Waiting rows whose in-queue pre-reqs are all satisfied — rows a tick
|
|
790
|
+
# could plausibly pick up next. Zero-with-waiting-rows is the stall.
|
|
791
|
+
eligible: int = 0
|
|
792
|
+
# Rows whose OWN deploy gate has fired, any scope — purely informational.
|
|
793
|
+
held: int = 0
|
|
794
|
+
# Rows whose FLEET-scoped deploy gate has fired — non-zero means the tick
|
|
795
|
+
# will launch nothing at all, whatever `eligible` says.
|
|
796
|
+
fleet_held: int = 0
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
def summarize_drive_queue(entries: Sequence[QueueEntry]) -> DriveQueueSummary:
|
|
800
|
+
"""Summarise *entries* — pure, no clock, no DB. See :class:`DriveQueueSummary`."""
|
|
801
|
+
pending = sum(1 for e in entries if _entry_is_pending(e))
|
|
802
|
+
held = sum(1 for e in entries if _entry_is_holding(e))
|
|
803
|
+
fleet_held = sum(1 for e in entries if _entry_stops_fleet(e))
|
|
804
|
+
running = waiting = blocked = eligible = 0
|
|
805
|
+
for e in entries:
|
|
806
|
+
if not _entry_is_pending(e):
|
|
807
|
+
continue
|
|
808
|
+
if e.state == STATE_RUNNING:
|
|
809
|
+
running += 1
|
|
810
|
+
elif e.state == STATE_BLOCKED:
|
|
811
|
+
blocked += 1
|
|
812
|
+
elif e.state == STATE_WAITING:
|
|
813
|
+
waiting += 1
|
|
814
|
+
if _after_satisfied(e, entries):
|
|
815
|
+
eligible += 1
|
|
816
|
+
# An unrecognised state from a newer daemon: counted in `pending`
|
|
817
|
+
# above (it is not `done`) but never as waiting/eligible/running/
|
|
818
|
+
# blocked, so it can neither trigger nor mask a stall.
|
|
819
|
+
|
|
820
|
+
if blocked > 0:
|
|
821
|
+
# Blocked outranks stalled — a hard stop is worse news than a queue
|
|
822
|
+
# that is merely waiting for capacity.
|
|
823
|
+
level = "blocked"
|
|
824
|
+
elif fleet_held > 0:
|
|
825
|
+
# #1757/#2186: a FLEET-scoped fired gate outranks a stall, even a
|
|
826
|
+
# real one — "3 waiting, none eligible" is a symptom here, and "you
|
|
827
|
+
# have a deploy to do" is the cause.
|
|
828
|
+
level = "held"
|
|
829
|
+
elif waiting > 0 and eligible == 0 and running == 0:
|
|
830
|
+
# Nothing running AND nothing that could start.
|
|
831
|
+
level = "stalled"
|
|
832
|
+
elif running > 0 or waiting > 0:
|
|
833
|
+
level = "normal"
|
|
834
|
+
else:
|
|
835
|
+
level = "empty"
|
|
836
|
+
|
|
837
|
+
return DriveQueueSummary(
|
|
838
|
+
level=level,
|
|
839
|
+
pending=pending,
|
|
840
|
+
running=running,
|
|
841
|
+
waiting=waiting,
|
|
842
|
+
blocked=blocked,
|
|
843
|
+
eligible=eligible,
|
|
844
|
+
held=held,
|
|
845
|
+
fleet_held=fleet_held,
|
|
846
|
+
)
|
|
847
|
+
|
|
848
|
+
|
|
725
849
|
# ── the board projection ─────────────────────────────────────────────────────
|
|
726
850
|
|
|
727
851
|
|
|
@@ -165,6 +165,8 @@ _JSON_COLUMN_SHAPES: dict[tuple[str, str], dict[str, Any]] = {
|
|
|
165
165
|
("issues", "labels"): {"type": "array", "items": {"type": "string"}},
|
|
166
166
|
("machines", "capabilities"): {"type": "array", "items": {"type": "string"}},
|
|
167
167
|
("machines", "repos"): {"type": "array", "items": {"type": "string"}},
|
|
168
|
+
# #2428: the drive queue's pre-req list — ["repo#N", ...] on the wire.
|
|
169
|
+
("drive_queue", "after_json"): {"type": "array", "items": {"type": "string"}},
|
|
168
170
|
}
|
|
169
171
|
|
|
170
172
|
_SQLITE_AFFINITY_TO_SCHEMA: dict[str, dict[str, Any]] = {
|
{code_coordinator-0.5.170 → code_coordinator-0.5.171}/tests/fixtures/board-pipeline-basic.json
RENAMED
|
@@ -218,6 +218,58 @@
|
|
|
218
218
|
}
|
|
219
219
|
],
|
|
220
220
|
|
|
221
|
+
"drive_queue": [
|
|
222
|
+
{
|
|
223
|
+
"repo_name": "claude-coordinator",
|
|
224
|
+
"issue_number": 4201,
|
|
225
|
+
"position": 0,
|
|
226
|
+
"machine": "precision",
|
|
227
|
+
"after_json": [],
|
|
228
|
+
"state": "running",
|
|
229
|
+
"attempts": 1,
|
|
230
|
+
"deferrals": 0,
|
|
231
|
+
"last_reason": "",
|
|
232
|
+
"session_name": "drive-cc-4201",
|
|
233
|
+
"hold_after": false,
|
|
234
|
+
"hold_reason": "",
|
|
235
|
+
"hold_state": "",
|
|
236
|
+
"hold_scope": "entry",
|
|
237
|
+
"resumes": 0
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"repo_name": "claude-coordinator",
|
|
241
|
+
"issue_number": 4202,
|
|
242
|
+
"position": 1,
|
|
243
|
+
"machine": "",
|
|
244
|
+
"after_json": ["claude-coordinator#4201"],
|
|
245
|
+
"state": "waiting",
|
|
246
|
+
"attempts": 0,
|
|
247
|
+
"deferrals": 1,
|
|
248
|
+
"last_reason": "waiting on claude-coordinator#4201",
|
|
249
|
+
"hold_after": false,
|
|
250
|
+
"hold_reason": "",
|
|
251
|
+
"hold_state": "",
|
|
252
|
+
"hold_scope": "entry",
|
|
253
|
+
"resumes": 0
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"repo_name": "quadraui",
|
|
257
|
+
"issue_number": 88,
|
|
258
|
+
"position": 0,
|
|
259
|
+
"machine": "",
|
|
260
|
+
"after_json": [],
|
|
261
|
+
"state": "waiting",
|
|
262
|
+
"attempts": 0,
|
|
263
|
+
"deferrals": 0,
|
|
264
|
+
"last_reason": "",
|
|
265
|
+
"hold_after": true,
|
|
266
|
+
"hold_reason": "deploy gate: schema migration",
|
|
267
|
+
"hold_state": "fired",
|
|
268
|
+
"hold_scope": "fleet",
|
|
269
|
+
"resumes": 0
|
|
270
|
+
}
|
|
271
|
+
],
|
|
272
|
+
|
|
221
273
|
"proposals": [
|
|
222
274
|
{
|
|
223
275
|
"id": 1,
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
|
+
import sqlite3
|
|
6
7
|
import time
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from unittest.mock import patch, MagicMock
|
|
@@ -49,6 +50,28 @@ def _client(tmp_path: Path | None = None) -> TestClient:
|
|
|
49
50
|
return TestClient(build_app(_config()))
|
|
50
51
|
|
|
51
52
|
|
|
53
|
+
@pytest.fixture
|
|
54
|
+
def rw_db(tmp_path: Path):
|
|
55
|
+
"""A thread-safe (file-backed, ``check_same_thread=False``) coord.db override.
|
|
56
|
+
|
|
57
|
+
The autouse ``coord_db`` fixture (tests/conftest.py) installs a
|
|
58
|
+
thread-bound ``:memory:`` connection, which ``TestClient`` (it runs the
|
|
59
|
+
async handler on a worker thread) can't touch — mirrors
|
|
60
|
+
``tests/test_serve.py``'s fixture of the same name, for the same reason:
|
|
61
|
+
production ``get_connection`` already uses ``check_same_thread=False``
|
|
62
|
+
(a file DB), so this just matches production for a route that actually
|
|
63
|
+
reads through it instead of a mocked seam.
|
|
64
|
+
"""
|
|
65
|
+
from coord import db
|
|
66
|
+
from coord.db import _ensure_schema
|
|
67
|
+
|
|
68
|
+
conn = sqlite3.connect(str(tmp_path / "rw.db"), check_same_thread=False)
|
|
69
|
+
conn.row_factory = sqlite3.Row
|
|
70
|
+
_ensure_schema(conn)
|
|
71
|
+
db.override_connection(conn)
|
|
72
|
+
yield conn
|
|
73
|
+
|
|
74
|
+
|
|
52
75
|
class TestIndexPage:
|
|
53
76
|
def test_serves_html(self) -> None:
|
|
54
77
|
client = _client()
|
|
@@ -405,6 +428,122 @@ class TestProposalsAPI:
|
|
|
405
428
|
assert r.json() == []
|
|
406
429
|
|
|
407
430
|
|
|
431
|
+
class TestDriveQueueAPI:
|
|
432
|
+
"""GET /api/drive-queue (#2428 DQW-1).
|
|
433
|
+
|
|
434
|
+
Unlike `TestBoardAPI`/`TestProposalsAPI` above, this reads straight
|
|
435
|
+
through `coord.state.list_drive_queue` -> the local DB (the `coord_db`
|
|
436
|
+
autouse fixture in conftest.py gives every test a fresh in-memory
|
|
437
|
+
SQLite, and `_no_board_service` guarantees `resolve_board_service()` is
|
|
438
|
+
unset) rather than mocking the read seam — the same "seeded DB -> GET ->
|
|
439
|
+
assert shape" bar every other `/api/*` route in this file meets.
|
|
440
|
+
"""
|
|
441
|
+
|
|
442
|
+
def test_empty_queue(self, rw_db) -> None:
|
|
443
|
+
client = _client()
|
|
444
|
+
r = client.get("/api/drive-queue")
|
|
445
|
+
assert r.status_code == 200
|
|
446
|
+
data = r.json()
|
|
447
|
+
assert data == {
|
|
448
|
+
"entries": [],
|
|
449
|
+
"summary": {
|
|
450
|
+
"level": "empty",
|
|
451
|
+
"pending": 0,
|
|
452
|
+
"running": 0,
|
|
453
|
+
"waiting": 0,
|
|
454
|
+
"blocked": 0,
|
|
455
|
+
"eligible": 0,
|
|
456
|
+
"held": 0,
|
|
457
|
+
"fleet_held": 0,
|
|
458
|
+
},
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
def test_seeded_db_returns_entries_and_summary(self, rw_db) -> None:
|
|
462
|
+
from coord.state import (
|
|
463
|
+
_enqueue_drive_queue_local,
|
|
464
|
+
_update_drive_queue_entry_local,
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
_enqueue_drive_queue_local("api", 1)
|
|
468
|
+
_enqueue_drive_queue_local("api", 2, after=["api#1"])
|
|
469
|
+
_update_drive_queue_entry_local("api", 1, state="running")
|
|
470
|
+
_enqueue_drive_queue_local("web", 9)
|
|
471
|
+
_update_drive_queue_entry_local(
|
|
472
|
+
"web", 9, state="blocked", last_reason="merge conflict"
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
client = _client()
|
|
476
|
+
r = client.get("/api/drive-queue")
|
|
477
|
+
assert r.status_code == 200
|
|
478
|
+
data = r.json()
|
|
479
|
+
|
|
480
|
+
entries = data["entries"]
|
|
481
|
+
assert len(entries) == 3
|
|
482
|
+
by_key = {(e["repo_name"], e["issue_number"]): e for e in entries}
|
|
483
|
+
assert by_key[("api", 1)]["state"] == "running"
|
|
484
|
+
assert by_key[("api", 2)]["state"] == "waiting"
|
|
485
|
+
assert by_key[("api", 2)]["after_json"] == ["api#1"]
|
|
486
|
+
assert by_key[("web", 9)]["state"] == "blocked"
|
|
487
|
+
assert by_key[("web", 9)]["last_reason"] == "merge conflict"
|
|
488
|
+
# #2428: raw entries carry the same columns the daemon's own
|
|
489
|
+
# GET /drive-queue and /board's drive_queue field already do — no
|
|
490
|
+
# reshaping, no invented fields.
|
|
491
|
+
assert {
|
|
492
|
+
"repo_name", "issue_number", "position", "state", "machine",
|
|
493
|
+
"attempts", "after_json", "hold_state", "hold_scope", "hold_after",
|
|
494
|
+
"last_reason", "resumes", "deferrals",
|
|
495
|
+
} <= set(by_key[("api", 1)])
|
|
496
|
+
|
|
497
|
+
summary = data["summary"]
|
|
498
|
+
assert summary["running"] == 1
|
|
499
|
+
assert summary["blocked"] == 1
|
|
500
|
+
# api#2's after=["api#1"] is unsatisfied — api#1 is `running`, not
|
|
501
|
+
# `done` — so it counts as waiting but NOT eligible.
|
|
502
|
+
assert summary["waiting"] == 1
|
|
503
|
+
assert summary["eligible"] == 0
|
|
504
|
+
assert summary["pending"] == 3
|
|
505
|
+
# blocked outranks everything else in the level ranking.
|
|
506
|
+
assert summary["level"] == "blocked"
|
|
507
|
+
|
|
508
|
+
def test_repo_filter_scopes_entries_but_not_the_summary(self, rw_db) -> None:
|
|
509
|
+
"""``?repo=`` narrows ``entries``; ``summary`` stays fleet-wide.
|
|
510
|
+
|
|
511
|
+
Non-blocking review finding on #2428: `fleet_held`/`level` are
|
|
512
|
+
documented (both in `tui/src/app/drive_queue.rs` and the Python port)
|
|
513
|
+
as fleet-wide facts — "non-zero means the tick launches nothing at
|
|
514
|
+
all" — and the summary's `_after_satisfied` treats a pre-req absent
|
|
515
|
+
from the entries it's given as satisfied. Summarizing only the
|
|
516
|
+
`?repo=`-filtered subset would let `GET /api/drive-queue?repo=api`
|
|
517
|
+
report `level: "normal"` while a DIFFERENT repo's fired fleet gate is
|
|
518
|
+
actually holding the whole queue. So `summary` must always reflect
|
|
519
|
+
the full queue, exactly like `entries_from_rows`' one Rust call site
|
|
520
|
+
always passes the unfiltered board queue.
|
|
521
|
+
"""
|
|
522
|
+
from coord.state import _enqueue_drive_queue_local, _update_drive_queue_entry_local
|
|
523
|
+
|
|
524
|
+
_enqueue_drive_queue_local("api", 1)
|
|
525
|
+
_enqueue_drive_queue_local(
|
|
526
|
+
"web", 2, hold_after=True, hold_reason="deploy gate", hold_scope="fleet",
|
|
527
|
+
)
|
|
528
|
+
_update_drive_queue_entry_local("web", 2, hold_state="fired")
|
|
529
|
+
|
|
530
|
+
client = _client()
|
|
531
|
+
r = client.get("/api/drive-queue", params={"repo": "api"})
|
|
532
|
+
assert r.status_code == 200
|
|
533
|
+
data = r.json()
|
|
534
|
+
# entries: narrowed to the requested repo.
|
|
535
|
+
assert [e["repo_name"] for e in data["entries"]] == ["api"]
|
|
536
|
+
# summary: unaffected by the filter — the "web" entry's fleet-scoped
|
|
537
|
+
# fired gate is still visible even though its row is filtered out of
|
|
538
|
+
# `entries`.
|
|
539
|
+
unfiltered = client.get("/api/drive-queue").json()
|
|
540
|
+
assert data["summary"] == unfiltered["summary"]
|
|
541
|
+
assert data["summary"]["pending"] == 2
|
|
542
|
+
assert data["summary"]["fleet_held"] == 1
|
|
543
|
+
assert data["summary"]["held"] == 1
|
|
544
|
+
assert data["summary"]["level"] == "held"
|
|
545
|
+
|
|
546
|
+
|
|
408
547
|
class TestApproveAPI:
|
|
409
548
|
# #749: board_service.read_board() tries load_board() before build_board()
|
|
410
549
|
# — mock both so the real load_board() (which needs a live connection on
|