code-coordinator 0.5.66__tar.gz → 0.5.68__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.66 → code_coordinator-0.5.68}/PKG-INFO +3 -1
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/README.md +2 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/code_coordinator.egg-info/PKG-INFO +3 -1
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/drive_queue.py +108 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/plan_followup.py +164 -29
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/config.py +12 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/drive_queue.py +49 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/merge_queue.py +39 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/models.py +15 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/revalidate.py +14 -1
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/smoke.py +101 -4
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coordinator.example.yml +17 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/OPERATING_GOTCHAS.md +35 -0
- code_coordinator-0.5.68/tests/test_ci_parity_2091.py +441 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_drive_queue.py +227 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_merge_queue.py +26 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_thin_client_board_audit.py +12 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/.gitignore +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/CLAUDE.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/GOAL.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/LICENSE +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/MANIFEST.in +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/__init__.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/agent.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/audit.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/board_service.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/brain.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/claim.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/cli.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/client.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/comments.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dao.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/db.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/deps.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/drive.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/events.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/filelock.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/freshness.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/gates.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/goal.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/context.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/models.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/render.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/health/units.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/hooks.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/interactive.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/network.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/notify.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/openapi.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/parentage.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/plans.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/progress.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/release_window.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/reports.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/review.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/split_work.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/state.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/test_author.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/test_report.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/usage.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/install-agent.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/pyproject.toml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/setup.cfg +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/__init__.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/conftest.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_config.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_db.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_events.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_init.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_models.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_network.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_review.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_session.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_split.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_state.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.66 → code_coordinator-0.5.68}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-coordinator
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.68
|
|
4
4
|
Summary: Coordinate Claude Code workers across multiple machines and repos.
|
|
5
5
|
Author-email: John Donaghy <johnfdonaghy@gmail.com>
|
|
6
6
|
License-Expression: LicenseRef-FSL-1.1-MIT
|
|
@@ -101,6 +101,7 @@ Every issue moves through four gated stages:
|
|
|
101
101
|
|
|
102
102
|
Two rules shape the flow:
|
|
103
103
|
|
|
104
|
+
- **A green Test verdict is only worth the suite behind it.** The Test stage runs `repos[].ci_command` when set, else `smoke_tests.default_command`, else `repos[].test_command`. If CI runs a *wider* suite than the gate does, "Test passed" means "some tests passed", not "the branch is good" — declare `ci_command` so the two agree (#2091). `dispatch_smoke` logs a warning for any GitHub-backed repo that hasn't.
|
|
104
105
|
- **Test precedes Review.** The smoke test runs *before* the PR/review — the natural order. Review auto-dispatch is **held** until the work has a `passed`/`skipped` Test verdict. A work item left at *Pending Test* gets no review, so it never merges — this is the single most common reason a story silently stalls. Record the verdict with `coord test <id> --passed|--skipped|--fail`, or the **P / S / F** keys on the Test stage in the TUI. The displayed stage order and this gate both come from `pipeline.default_gates` in `coordinator.yml` (default `[test, review, merge]`).
|
|
105
106
|
- **A failed test routes exactly like a request-changes review.** Both drop the issue back to a fix on the *same* branch (`coord fix`, or the interactive `--fix-of`), never an orphan.
|
|
106
107
|
|
|
@@ -427,6 +428,7 @@ repos:
|
|
|
427
428
|
develop_branch: develop # opt in to the milestone feature-branch model (see Milestones)
|
|
428
429
|
build_command: "npm run build"
|
|
429
430
|
test_command: "npm test"
|
|
431
|
+
ci_command: "npm run test:e2e" # what CI actually runs — the Test gate prefers this (#2091)
|
|
430
432
|
artifact_paths: # stash built binaries so `coord pull-artifact` can rsync them
|
|
431
433
|
- dist/
|
|
432
434
|
|
|
@@ -61,6 +61,7 @@ Every issue moves through four gated stages:
|
|
|
61
61
|
|
|
62
62
|
Two rules shape the flow:
|
|
63
63
|
|
|
64
|
+
- **A green Test verdict is only worth the suite behind it.** The Test stage runs `repos[].ci_command` when set, else `smoke_tests.default_command`, else `repos[].test_command`. If CI runs a *wider* suite than the gate does, "Test passed" means "some tests passed", not "the branch is good" — declare `ci_command` so the two agree (#2091). `dispatch_smoke` logs a warning for any GitHub-backed repo that hasn't.
|
|
64
65
|
- **Test precedes Review.** The smoke test runs *before* the PR/review — the natural order. Review auto-dispatch is **held** until the work has a `passed`/`skipped` Test verdict. A work item left at *Pending Test* gets no review, so it never merges — this is the single most common reason a story silently stalls. Record the verdict with `coord test <id> --passed|--skipped|--fail`, or the **P / S / F** keys on the Test stage in the TUI. The displayed stage order and this gate both come from `pipeline.default_gates` in `coordinator.yml` (default `[test, review, merge]`).
|
|
65
66
|
- **A failed test routes exactly like a request-changes review.** Both drop the issue back to a fix on the *same* branch (`coord fix`, or the interactive `--fix-of`), never an orphan.
|
|
66
67
|
|
|
@@ -387,6 +388,7 @@ repos:
|
|
|
387
388
|
develop_branch: develop # opt in to the milestone feature-branch model (see Milestones)
|
|
388
389
|
build_command: "npm run build"
|
|
389
390
|
test_command: "npm test"
|
|
391
|
+
ci_command: "npm run test:e2e" # what CI actually runs — the Test gate prefers this (#2091)
|
|
390
392
|
artifact_paths: # stash built binaries so `coord pull-artifact` can rsync them
|
|
391
393
|
- dist/
|
|
392
394
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-coordinator
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.68
|
|
4
4
|
Summary: Coordinate Claude Code workers across multiple machines and repos.
|
|
5
5
|
Author-email: John Donaghy <johnfdonaghy@gmail.com>
|
|
6
6
|
License-Expression: LicenseRef-FSL-1.1-MIT
|
|
@@ -101,6 +101,7 @@ Every issue moves through four gated stages:
|
|
|
101
101
|
|
|
102
102
|
Two rules shape the flow:
|
|
103
103
|
|
|
104
|
+
- **A green Test verdict is only worth the suite behind it.** The Test stage runs `repos[].ci_command` when set, else `smoke_tests.default_command`, else `repos[].test_command`. If CI runs a *wider* suite than the gate does, "Test passed" means "some tests passed", not "the branch is good" — declare `ci_command` so the two agree (#2091). `dispatch_smoke` logs a warning for any GitHub-backed repo that hasn't.
|
|
104
105
|
- **Test precedes Review.** The smoke test runs *before* the PR/review — the natural order. Review auto-dispatch is **held** until the work has a `passed`/`skipped` Test verdict. A work item left at *Pending Test* gets no review, so it never merges — this is the single most common reason a story silently stalls. Record the verdict with `coord test <id> --passed|--skipped|--fail`, or the **P / S / F** keys on the Test stage in the TUI. The displayed stage order and this gate both come from `pipeline.default_gates` in `coordinator.yml` (default `[test, review, merge]`).
|
|
105
106
|
- **A failed test routes exactly like a request-changes review.** Both drop the issue back to a fix on the *same* branch (`coord fix`, or the interactive `--fix-of`), never an orphan.
|
|
106
107
|
|
|
@@ -427,6 +428,7 @@ repos:
|
|
|
427
428
|
develop_branch: develop # opt in to the milestone feature-branch model (see Milestones)
|
|
428
429
|
build_command: "npm run build"
|
|
429
430
|
test_command: "npm test"
|
|
431
|
+
ci_command: "npm run test:e2e" # what CI actually runs — the Test gate prefers this (#2091)
|
|
430
432
|
artifact_paths: # stash built binaries so `coord pull-artifact` can rsync them
|
|
431
433
|
- dist/
|
|
432
434
|
|
|
@@ -451,6 +451,7 @@ tests/test_bug_intake.py
|
|
|
451
451
|
tests/test_build_worker_image_env_update.py
|
|
452
452
|
tests/test_cargo_cache.py
|
|
453
453
|
tests/test_ci_acceptance_gate_1950.py
|
|
454
|
+
tests/test_ci_parity_2091.py
|
|
454
455
|
tests/test_ci_store.py
|
|
455
456
|
tests/test_claim.py
|
|
456
457
|
tests/test_cli_acceptance.py
|
{code_coordinator-0.5.66 → code_coordinator-0.5.68}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -481,6 +481,7 @@
|
|
|
481
481
|
"tests/test_build_worker_image_env_update.py",
|
|
482
482
|
"tests/test_cargo_cache.py",
|
|
483
483
|
"tests/test_ci_acceptance_gate_1950.py",
|
|
484
|
+
"tests/test_ci_parity_2091.py",
|
|
484
485
|
"tests/test_ci_store.py",
|
|
485
486
|
"tests/test_claim.py",
|
|
486
487
|
"tests/test_cli_acceptance.py",
|
|
@@ -1006,6 +1006,105 @@ def _fetch_gate_a_pending(entries: list) -> dict[str, bool]:
|
|
|
1006
1006
|
return pending
|
|
1007
1007
|
|
|
1008
1008
|
|
|
1009
|
+
def _fetch_live_ci_gate(
|
|
1010
|
+
entries: list, config_path: Path | None
|
|
1011
|
+
) -> dict[str, bool]:
|
|
1012
|
+
"""``{entry_key: still_blocked}`` for every ``parked`` entry whose OWN
|
|
1013
|
+
park reason is CI-shaped (#1891/#1892) — a FRESH, single-entry
|
|
1014
|
+
re-derivation of the SAME gate ``coord merge --plan`` computes, taken
|
|
1015
|
+
live, right now, this tick (#2182).
|
|
1016
|
+
|
|
1017
|
+
THE GAP THIS CLOSES. On the daemon host — the only machine that ever
|
|
1018
|
+
runs this tick (``docs/AGENT_OPERATIONS.md``) — ``_fetch_board_view``
|
|
1019
|
+
reads the local DB directly and never populates ``merge_plan`` at all
|
|
1020
|
+
(see ``_local_merge_queue_rows``'s docstring): it is *computed*, not
|
|
1021
|
+
stored, and computing it needs a live ``ci_store``/``gh_ops`` this
|
|
1022
|
+
read-only board fetch deliberately does not build. So
|
|
1023
|
+
``IssueFacts.merge_ci_pending_live`` is unconditionally ``False`` on
|
|
1024
|
+
every parked entry this tick ever sees, and the ONLY thing that used to
|
|
1025
|
+
release such a park was :data:`coord.drive_queue.PARK_STALE_SECONDS` —
|
|
1026
|
+
up to 45 minutes — even at the instant CI actually reports, because
|
|
1027
|
+
nothing on the read path ever re-checked. claude-coordinator#2159 is
|
|
1028
|
+
that gap caught live: at 03:25:46 UTC, ``coord merge --dry-run`` for the
|
|
1029
|
+
entry read READY (no gate objection) while ``coord drive-queue list``,
|
|
1030
|
+
reading the SAME board a moment later, still read ``parked`` — the two
|
|
1031
|
+
surfaces disagreeing about the exact same fact.
|
|
1032
|
+
|
|
1033
|
+
THE FIX. Scoped to the bounded few entries actually sitting in
|
|
1034
|
+
``parked`` on a CI reason right now (typically 0-1, never the whole
|
|
1035
|
+
merge queue — see :func:`coord.merge_queue.entry_gate_status`'s
|
|
1036
|
+
docstring for why this deliberately does NOT call the whole-queue
|
|
1037
|
+
:func:`coord.merge_queue.plan` instead), so paying for a live
|
|
1038
|
+
``gh``-backed check per entry, every ~3-minute tick, is the same
|
|
1039
|
+
"small and predictable" cost an operator's own ``coord merge --plan``
|
|
1040
|
+
already pays on demand — not the unbounded per-tick GitHub polling
|
|
1041
|
+
#1344 removed from the read path.
|
|
1042
|
+
|
|
1043
|
+
Fails OPEN per entry and CLOSED overall in the sense that matters: a key
|
|
1044
|
+
simply ABSENT from the returned dict (an unreadable config, a
|
|
1045
|
+
``ci_store`` that failed to build, an entry ``coord.merge_queue.
|
|
1046
|
+
load_queue()`` no longer carries, or any other exception) leaves that
|
|
1047
|
+
entry to :func:`coord.drive_queue.plan_tick`'s pre-#2182 fallback — the
|
|
1048
|
+
#2158 :data:`~coord.drive_queue.PARK_STALE_SECONDS` ceiling — exactly as
|
|
1049
|
+
if this function had never run. A transient failure here degrades to
|
|
1050
|
+
the OLD (already-shipped, already-bounded) behaviour, never to a wedge
|
|
1051
|
+
and never to a wrongly-forced resume.
|
|
1052
|
+
|
|
1053
|
+
Gated on ``resolve_board_service() is None`` (the daemon-host tick,
|
|
1054
|
+
same guard :func:`_fetch_board_view` uses for its own local-DB top-up):
|
|
1055
|
+
on a thin client the daemon's real ``GET /board`` already carries a live
|
|
1056
|
+
``merge_plan`` section, so ``build_board_view`` already resolves
|
|
1057
|
+
``merge_ci_pending_live=True`` there on its own and this function would
|
|
1058
|
+
have nothing to add — worse, ``coord.state.load_board()`` guards against
|
|
1059
|
+
being called from a thin client at all (#615).
|
|
1060
|
+
"""
|
|
1061
|
+
from coord.merge_queue import is_ci_infra_reason, is_ci_pending_reason # noqa: PLC0415
|
|
1062
|
+
|
|
1063
|
+
targets = [
|
|
1064
|
+
e for e in entries
|
|
1065
|
+
if e.state == STATE_PARKED
|
|
1066
|
+
and (
|
|
1067
|
+
is_ci_pending_reason(getattr(e, "last_reason", "") or "")
|
|
1068
|
+
or is_ci_infra_reason(getattr(e, "last_reason", "") or "")
|
|
1069
|
+
)
|
|
1070
|
+
]
|
|
1071
|
+
if not targets:
|
|
1072
|
+
return {}
|
|
1073
|
+
|
|
1074
|
+
from coord.board_service import resolve as resolve_board_service # noqa: PLC0415
|
|
1075
|
+
|
|
1076
|
+
if resolve_board_service() is not None:
|
|
1077
|
+
return {}
|
|
1078
|
+
|
|
1079
|
+
try:
|
|
1080
|
+
from coord import github_ops as _gh_ops # noqa: PLC0415
|
|
1081
|
+
from coord import merge_queue as _mq # noqa: PLC0415
|
|
1082
|
+
from coord.ci_store import build_ci_store # noqa: PLC0415
|
|
1083
|
+
from coord.commands._common import _load_config # noqa: PLC0415
|
|
1084
|
+
from coord.state import load_board as _load_board # noqa: PLC0415
|
|
1085
|
+
|
|
1086
|
+
cfg = _load_config(config_path)
|
|
1087
|
+
board = _load_board()
|
|
1088
|
+
ci_store = build_ci_store(cfg.ci_store.type)
|
|
1089
|
+
queue_by_key = {
|
|
1090
|
+
entry_key(q.repo_name, q.issue_number): q for q in _mq.load_queue()
|
|
1091
|
+
}
|
|
1092
|
+
except Exception: # noqa: BLE001 — see the fail-soft note above
|
|
1093
|
+
return {}
|
|
1094
|
+
|
|
1095
|
+
overrides: dict[str, bool] = {}
|
|
1096
|
+
for e in targets:
|
|
1097
|
+
q = queue_by_key.get(e.key)
|
|
1098
|
+
if q is None or not q.pr_number:
|
|
1099
|
+
continue
|
|
1100
|
+
try:
|
|
1101
|
+
status, _reason = _mq.entry_gate_status(q, board, cfg, ci_store, _gh_ops)
|
|
1102
|
+
except Exception: # noqa: BLE001 — leave this one entry to the ceiling
|
|
1103
|
+
continue
|
|
1104
|
+
overrides[e.key] = status != _mq.PLAN_READY
|
|
1105
|
+
return overrides
|
|
1106
|
+
|
|
1107
|
+
|
|
1009
1108
|
def _launch_argv(entry: QueueEntry, config_path: Path | None) -> list[str]:
|
|
1010
1109
|
"""The ``coord drive --tmux`` argv for *entry*.
|
|
1011
1110
|
|
|
@@ -1318,6 +1417,14 @@ def drive_queue_tick(
|
|
|
1318
1417
|
# tick when no entry is parked that way — which is the common case.
|
|
1319
1418
|
gate_a_pending = _fetch_gate_a_pending(entries)
|
|
1320
1419
|
|
|
1420
|
+
# #2182: for every entry parked on a CI reason, a fresh single-entry
|
|
1421
|
+
# re-derivation of its gate, taken live THIS tick — see
|
|
1422
|
+
# `_fetch_live_ci_gate`'s docstring for the gap this closes (a park
|
|
1423
|
+
# on the daemon-host tick could previously be released only by the
|
|
1424
|
+
# #2158 45-minute ceiling, never by CI actually reporting, because
|
|
1425
|
+
# this tick's board read never computes a live `merge_plan`).
|
|
1426
|
+
live_ci_gate = _fetch_live_ci_gate(entries, config_path)
|
|
1427
|
+
|
|
1321
1428
|
# #2101: release cordons. THIS is the hole the issue names — the
|
|
1322
1429
|
# queue's launcher had zero pause awareness (`coord/drive.py` checks
|
|
1323
1430
|
# pause only when routing a *worker*), so a cordoned host kept getting
|
|
@@ -1349,6 +1456,7 @@ def drive_queue_tick(
|
|
|
1349
1456
|
exit_dead_end=exit_dead_end,
|
|
1350
1457
|
gate_a_pending=gate_a_pending,
|
|
1351
1458
|
cordons=cordons,
|
|
1459
|
+
live_ci_gate=live_ci_gate,
|
|
1352
1460
|
)
|
|
1353
1461
|
|
|
1354
1462
|
if reconcile_only:
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
|
|
6
6
|
import sys
|
|
7
7
|
import time
|
|
8
|
+
from dataclasses import dataclass
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
|
|
10
11
|
import click
|
|
@@ -470,7 +471,69 @@ def review(assignment_id: str, config_path: Path) -> None:
|
|
|
470
471
|
click.echo(f" pr: {assignment.pr_url}")
|
|
471
472
|
|
|
472
473
|
|
|
473
|
-
|
|
474
|
+
@dataclass(frozen=True)
|
|
475
|
+
class CiRead:
|
|
476
|
+
"""#2091: the outcome of the live-CI read, with "did not read" separated
|
|
477
|
+
from "read it, it was green".
|
|
478
|
+
|
|
479
|
+
Before #2091 this path collapsed both into a bare ``None``, and the
|
|
480
|
+
refusal message told the operator only that no red CI was found. In
|
|
481
|
+
coord-portal #14 the PR *was* red (``gh pr checks 42`` said so) — the
|
|
482
|
+
read had simply never happened, and the operator was left to guess which
|
|
483
|
+
of six silent short-circuits fired. ``unread_reason`` names it.
|
|
484
|
+
|
|
485
|
+
Invariants:
|
|
486
|
+
|
|
487
|
+
* ``story`` set → CI was read and is RED.
|
|
488
|
+
* ``story is None`` and no ``unread_reason`` → CI was read, nothing red.
|
|
489
|
+
* ``unread_reason`` set → **no read happened**; this is
|
|
490
|
+
not evidence of green, and callers must say so out loud.
|
|
491
|
+
"""
|
|
492
|
+
|
|
493
|
+
story: str | None = None
|
|
494
|
+
unread_reason: str | None = None
|
|
495
|
+
pr_number: int | None = None
|
|
496
|
+
|
|
497
|
+
@property
|
|
498
|
+
def is_red(self) -> bool:
|
|
499
|
+
return self.story is not None
|
|
500
|
+
|
|
501
|
+
@property
|
|
502
|
+
def was_read(self) -> bool:
|
|
503
|
+
return self.unread_reason is None
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
def _resolve_pr_number(repo_github: str, assignment) -> int | None:
|
|
507
|
+
"""PR number for *assignment*, from its ``pr_url`` or (#2091) its branch.
|
|
508
|
+
|
|
509
|
+
The stored ``pr_url`` is missing on any row whose PR was opened out of
|
|
510
|
+
band, or that predates PR creation — and that alone used to silently
|
|
511
|
+
disable the whole live-CI fallback. Fall back to asking GitHub which PR
|
|
512
|
+
has this branch as its head, which is the same question ``gh pr checks``
|
|
513
|
+
answers from a checkout.
|
|
514
|
+
"""
|
|
515
|
+
from coord.drive import _extract_pr_number
|
|
516
|
+
|
|
517
|
+
pr_number = _extract_pr_number(getattr(assignment, "pr_url", None) or "")
|
|
518
|
+
if pr_number is not None:
|
|
519
|
+
return pr_number
|
|
520
|
+
|
|
521
|
+
branch = getattr(assignment, "branch", None)
|
|
522
|
+
if not branch:
|
|
523
|
+
return None
|
|
524
|
+
try:
|
|
525
|
+
from coord import github_ops # noqa: PLC0415
|
|
526
|
+
|
|
527
|
+
pr = github_ops.find_pr_for_branch(repo_github, branch)
|
|
528
|
+
except Exception: # noqa: BLE001 — advisory lookup, never fatal
|
|
529
|
+
return None
|
|
530
|
+
if not isinstance(pr, dict):
|
|
531
|
+
return None
|
|
532
|
+
number = pr.get("number")
|
|
533
|
+
return number if isinstance(number, int) else None
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
def _read_ci(cfg: Config, assignment) -> CiRead:
|
|
474
537
|
"""#1622 (part 3): a rendered summary of *assignment*'s FAILED CI checks.
|
|
475
538
|
|
|
476
539
|
The third legitimate fix trigger, alongside a request-changes review and a
|
|
@@ -479,37 +542,70 @@ def _ci_failure_story(cfg: Config, assignment) -> str | None:
|
|
|
479
542
|
checkout — and the fix has to land on the *existing* branch, because the
|
|
480
543
|
thing being fixed is what gates the merge.
|
|
481
544
|
|
|
482
|
-
Read-only and fail-quiet
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
when the read raises, or when every completed check is affirmatively
|
|
486
|
-
passing. ``None`` therefore means "no CI evidence of a failure", never
|
|
487
|
-
"CI is green" — the caller must not treat it as a verdict.
|
|
545
|
+
Read-only and fail-quiet, but no longer fail-*silent* (#2091): every path
|
|
546
|
+
that declines to read returns a :class:`CiRead` carrying the reason, so
|
|
547
|
+
the caller can distinguish "CI is green" from "nobody looked".
|
|
488
548
|
"""
|
|
489
549
|
from coord.ci_store import build_ci_store, failed_checks, summarize
|
|
490
|
-
from coord.drive import _extract_pr_number
|
|
491
550
|
|
|
492
551
|
repo = cfg.repo(assignment.repo_name)
|
|
493
|
-
if repo is None
|
|
494
|
-
return
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
552
|
+
if repo is None:
|
|
553
|
+
return CiRead(unread_reason=f"repo {assignment.repo_name!r} is not in coordinator.yml")
|
|
554
|
+
if not repo.github:
|
|
555
|
+
return CiRead(
|
|
556
|
+
unread_reason=f"repo {repo.name!r} has no `github:` slug configured"
|
|
557
|
+
)
|
|
499
558
|
|
|
559
|
+
# Availability first (#2091): `_resolve_pr_number`'s branch fallback can
|
|
560
|
+
# shell out to `gh`, and there is no point paying for that when the store
|
|
561
|
+
# will refuse to read anything anyway.
|
|
500
562
|
store = build_ci_store(cfg.ci_store.type)
|
|
501
563
|
if not store.is_available:
|
|
502
|
-
return
|
|
564
|
+
return CiRead(
|
|
565
|
+
unread_reason=(
|
|
566
|
+
f"ci_store.type is {cfg.ci_store.type!r}, so live CI is never "
|
|
567
|
+
"read — set it to 'github' in coordinator.yml"
|
|
568
|
+
),
|
|
569
|
+
)
|
|
570
|
+
|
|
571
|
+
pr_number = _resolve_pr_number(repo.github, assignment)
|
|
572
|
+
if pr_number is None:
|
|
573
|
+
return CiRead(
|
|
574
|
+
unread_reason=(
|
|
575
|
+
"no PR could be resolved for this row (its `pr_url` is empty "
|
|
576
|
+
f"and no open PR has head branch {getattr(assignment, 'branch', None)!r})"
|
|
577
|
+
)
|
|
578
|
+
)
|
|
503
579
|
|
|
504
580
|
try:
|
|
505
581
|
checks = store.list_checks_for_pr(repo.github, pr_number)
|
|
506
582
|
except Exception as exc: # noqa: BLE001 — CI read is advisory, never fatal
|
|
507
583
|
click.echo(f"warning: could not read CI checks for PR #{pr_number}: {exc}", err=True)
|
|
508
|
-
return
|
|
584
|
+
return CiRead(
|
|
585
|
+
pr_number=pr_number,
|
|
586
|
+
unread_reason=f"the CI read for PR #{pr_number} raised: {exc}",
|
|
587
|
+
)
|
|
588
|
+
|
|
589
|
+
if not checks:
|
|
590
|
+
return CiRead(
|
|
591
|
+
pr_number=pr_number,
|
|
592
|
+
unread_reason=f"PR #{pr_number} reported no checks at all",
|
|
593
|
+
)
|
|
509
594
|
|
|
510
595
|
failed = failed_checks(checks)
|
|
511
596
|
if not failed:
|
|
512
|
-
|
|
597
|
+
# A genuine read that found nothing red. Note this still includes the
|
|
598
|
+
# case where every check is *pending* — `failed_checks` only considers
|
|
599
|
+
# completed ones — so say which, rather than implying a settled green.
|
|
600
|
+
if not any(c.status == "completed" for c in checks):
|
|
601
|
+
return CiRead(
|
|
602
|
+
pr_number=pr_number,
|
|
603
|
+
unread_reason=(
|
|
604
|
+
f"every check on PR #{pr_number} is still running "
|
|
605
|
+
f"({summarize(checks)}) — no completed verdict yet"
|
|
606
|
+
),
|
|
607
|
+
)
|
|
608
|
+
return CiRead(pr_number=pr_number)
|
|
513
609
|
|
|
514
610
|
lines = [
|
|
515
611
|
f"CI on PR #{pr_number} is RED ({summarize(checks)}).",
|
|
@@ -525,7 +621,7 @@ def _ci_failure_story(cfg: Config, assignment) -> str | None:
|
|
|
525
621
|
"reproduce locally where you can, and fix the root cause on THIS "
|
|
526
622
|
"branch — a new branch would not carry the change CI is gating on.",
|
|
527
623
|
]
|
|
528
|
-
return "\n".join(lines)
|
|
624
|
+
return CiRead(story="\n".join(lines), pr_number=pr_number)
|
|
529
625
|
|
|
530
626
|
|
|
531
627
|
def _fix_from_review(
|
|
@@ -695,8 +791,10 @@ def _fix_from_review(
|
|
|
695
791
|
"work that ran under claude-pty, or (#2051) dispatch a WORK-row fix "
|
|
696
792
|
"when neither the test verdict nor a live CI read shows a failure — "
|
|
697
793
|
"for when the caller knows the PR is red but the check missed it "
|
|
698
|
-
"(ci_store not configured, a transient read error).
|
|
699
|
-
"
|
|
794
|
+
"(ci_store not configured, a transient read error). Since #2091 the "
|
|
795
|
+
"refusal names which of those it was, so check the `note:` line "
|
|
796
|
+
"before reaching for this. Does NOT override max_review_iterations "
|
|
797
|
+
"or the #522 terminal-work guard."
|
|
700
798
|
),
|
|
701
799
|
)
|
|
702
800
|
def fix(assignment_id: str, config_path: Path, guidance: str, force: bool) -> None:
|
|
@@ -729,17 +827,37 @@ def fix(assignment_id: str, config_path: Path, guidance: str, force: bool) -> No
|
|
|
729
827
|
# #1622 (part 3): red CI is the third trigger. Only consulted when the
|
|
730
828
|
# local test gate has NOT already failed, so the cheap in-DB path stays
|
|
731
829
|
# zero-I/O and the existing failure story keeps priority.
|
|
732
|
-
|
|
830
|
+
ci_read = CiRead() if test_failed else _read_ci(cfg, assignment)
|
|
831
|
+
ci_story = ci_read.story
|
|
832
|
+
|
|
833
|
+
# #2091: the stored Test verdict says PASSED while the branch's live CI
|
|
834
|
+
# says RED — the coord-portal #14 shape. Both are "the tests", and they
|
|
835
|
+
# disagree; that is a fact about the Test gate (it ran a narrower suite
|
|
836
|
+
# than CI), not a detail of this dispatch, so name it rather than
|
|
837
|
+
# quietly preferring one.
|
|
838
|
+
if ci_read.is_red and (
|
|
839
|
+
assignment.test_state == "passed" or assignment.smoke_test == "pass"
|
|
840
|
+
):
|
|
841
|
+
stored_verdict = assignment.test_state or assignment.smoke_test
|
|
842
|
+
click.echo(
|
|
843
|
+
f"conflict (#2091): assignment {assignment_id} has a stored Test "
|
|
844
|
+
f"verdict of {stored_verdict!r} "
|
|
845
|
+
f"but CI on PR #{ci_read.pr_number} is RED on the same branch. "
|
|
846
|
+
"The Test stage ran a narrower suite than CI — set "
|
|
847
|
+
f"repos[{assignment.repo_name}].ci_command to what CI runs so "
|
|
848
|
+
"the gate stops reporting green on a red branch.",
|
|
849
|
+
err=True,
|
|
850
|
+
)
|
|
733
851
|
|
|
734
852
|
# #2051: none of the three doors (failed test verdict, red CI, or the
|
|
735
|
-
# review-id door handled above) is open. `
|
|
736
|
-
#
|
|
737
|
-
#
|
|
738
|
-
#
|
|
739
|
-
#
|
|
740
|
-
#
|
|
741
|
-
#
|
|
742
|
-
#
|
|
853
|
+
# review-id door handled above) is open. `_read_ci` is read-only and
|
|
854
|
+
# fail-quiet (see :class:`CiRead`) — a missing story means "no CI
|
|
855
|
+
# evidence of a failure", never "CI is green" — so a caller who KNOWS
|
|
856
|
+
# the PR is red (ci_store not configured for this repo, a transient
|
|
857
|
+
# GitHub API error, a check that hasn't reported yet) would otherwise be
|
|
858
|
+
# stranded with no headless door onto the ORIGINAL branch. `--force` is
|
|
859
|
+
# that caller's release valve; it is NOT a way to skip the #555 / #522 /
|
|
860
|
+
# max_review_iterations guards, which sit elsewhere.
|
|
743
861
|
forced_without_evidence = False
|
|
744
862
|
if not test_failed and ci_story is None:
|
|
745
863
|
if not force:
|
|
@@ -752,6 +870,23 @@ def fix(assignment_id: str, config_path: Path, guidance: str, force: bool) -> No
|
|
|
752
870
|
"with --force.",
|
|
753
871
|
err=True,
|
|
754
872
|
)
|
|
873
|
+
# #2091: say WHY there is no CI evidence. Before this, six
|
|
874
|
+
# distinct short-circuits (unconfigured ci_store, a row with no
|
|
875
|
+
# pr_url, an unknown repo, ...) were all indistinguishable from
|
|
876
|
+
# "CI is green", so an operator staring at a red `gh pr checks`
|
|
877
|
+
# had no way to tell that the documented fallback never ran.
|
|
878
|
+
if not ci_read.was_read:
|
|
879
|
+
click.echo(
|
|
880
|
+
" note: live CI was NOT read for this row, so this is "
|
|
881
|
+
f"not a green-CI finding — {ci_read.unread_reason}.",
|
|
882
|
+
err=True,
|
|
883
|
+
)
|
|
884
|
+
elif ci_read.pr_number is not None:
|
|
885
|
+
click.echo(
|
|
886
|
+
f" note: live CI on PR #{ci_read.pr_number} was read and "
|
|
887
|
+
"reported no failing completed check.",
|
|
888
|
+
err=True,
|
|
889
|
+
)
|
|
755
890
|
sys.exit(1)
|
|
756
891
|
if not guidance:
|
|
757
892
|
# There's no failed verdict, CI read, or test-output file to
|
|
@@ -1880,6 +1880,17 @@ def _parse_repos(raw: Any) -> list[Repo]:
|
|
|
1880
1880
|
test_command = entry.get("test_command")
|
|
1881
1881
|
if test_command is not None and not isinstance(test_command, str):
|
|
1882
1882
|
raise ConfigError(f"repos[{i}].test_command must be a string")
|
|
1883
|
+
# #2091: ci_command — the command this repo's CI actually runs. The
|
|
1884
|
+
# Test stage prefers it over `test_command` so a green Test verdict
|
|
1885
|
+
# is CI-equivalent instead of "some subset of CI passed".
|
|
1886
|
+
ci_command = entry.get("ci_command")
|
|
1887
|
+
if ci_command is not None and not isinstance(ci_command, str):
|
|
1888
|
+
raise ConfigError(f"repos[{i}].ci_command must be a string")
|
|
1889
|
+
if isinstance(ci_command, str) and not ci_command.strip():
|
|
1890
|
+
raise ConfigError(
|
|
1891
|
+
f"repos[{i}].ci_command must be a non-empty string (omit the "
|
|
1892
|
+
"key entirely to fall back to test_command)"
|
|
1893
|
+
)
|
|
1883
1894
|
# #296: run_cmd — optional shell command to launch the app for manual
|
|
1884
1895
|
# smoke testing. Surfaced in the TUI Test stage detail panel.
|
|
1885
1896
|
run_cmd = entry.get("run_cmd")
|
|
@@ -1933,6 +1944,7 @@ def _parse_repos(raw: Any) -> list[Repo]:
|
|
|
1933
1944
|
develop_branch=develop_branch,
|
|
1934
1945
|
build_command=build_command,
|
|
1935
1946
|
test_command=test_command,
|
|
1947
|
+
ci_command=ci_command,
|
|
1936
1948
|
run_cmd=run_cmd,
|
|
1937
1949
|
worker_permissions=worker_permissions,
|
|
1938
1950
|
housekeeping=housekeeping,
|
|
@@ -1932,6 +1932,7 @@ def plan_tick(
|
|
|
1932
1932
|
exit_dead_end: Mapping[str, bool] | None = None,
|
|
1933
1933
|
gate_a_pending: Mapping[str, bool] | None = None,
|
|
1934
1934
|
cordons: Mapping[str, str] | None = None,
|
|
1935
|
+
live_ci_gate: Mapping[str, bool] | None = None,
|
|
1935
1936
|
) -> TickPlan:
|
|
1936
1937
|
"""Decide one tick. Pure; the caller executes the returned plan.
|
|
1937
1938
|
|
|
@@ -2008,6 +2009,21 @@ def plan_tick(
|
|
|
2008
2009
|
#2110 deadlock, re-created by the very mechanism meant to end it. A
|
|
2009
2010
|
cordoned tick is exactly `--reconcile-only`.
|
|
2010
2011
|
|
|
2012
|
+
*live_ci_gate* maps a `parked` entry's key to whether a FRESH,
|
|
2013
|
+
single-entry re-derivation of its gate — computed by the shell THIS
|
|
2014
|
+
tick, via :func:`coord.merge_queue.entry_gate_status` with a live
|
|
2015
|
+
``ci_store``/``gh_ops``, the same backend ``coord merge --plan`` builds
|
|
2016
|
+
— still finds it blocked (#2182). A key present here is authoritative
|
|
2017
|
+
over both the cached board's `merge_ci_pending` and the #2158 staleness
|
|
2018
|
+
ceiling below: there is no ceiling to apply to a reading taken just now.
|
|
2019
|
+
A key ABSENT (the entry isn't CI-parked, or the shell's live check
|
|
2020
|
+
itself couldn't be made — no PR yet, an unreadable config, a `ci_store`
|
|
2021
|
+
that failed to build) falls through unchanged to the pre-#2182 path,
|
|
2022
|
+
the #2158 ceiling included — see
|
|
2023
|
+
:func:`coord.commands.drive_queue._fetch_live_ci_gate` for the shell
|
|
2024
|
+
side, which computes this ONLY for the bounded set of entries currently
|
|
2025
|
+
`parked` on a CI reason, never the whole queue.
|
|
2026
|
+
|
|
2011
2027
|
The algorithm, from #1754, plus #1757's step 2, #1891's step 1b, and
|
|
2012
2028
|
#2055's extension of it:
|
|
2013
2029
|
|
|
@@ -2164,6 +2180,39 @@ def plan_tick(
|
|
|
2164
2180
|
# relaunch a gave-up entry outside the `blocked`/`failed`
|
|
2165
2181
|
# attempt-tracking this function's docstring describes (#2055).
|
|
2166
2182
|
continue
|
|
2183
|
+
# #2182: a FRESH, single-entry re-derivation of this exact entry's
|
|
2184
|
+
# gate, taken by the shell THIS tick (see the `live_ci_gate`
|
|
2185
|
+
# parameter doc above) — authoritative over both the cached board
|
|
2186
|
+
# reading below and the #2158 staleness ceiling, because there is no
|
|
2187
|
+
# staleness to a reading computed just now. Bypasses that whole
|
|
2188
|
+
# apparatus entirely rather than layering on top of it: a `True`
|
|
2189
|
+
# here means the SAME check `coord merge --plan` would run still
|
|
2190
|
+
# finds this entry blocked (stay parked, no ceiling needed — held
|
|
2191
|
+
# for as long as the live check keeps saying so, exactly like a
|
|
2192
|
+
# live `merge_plan` reason always was); a `False` means the plan
|
|
2193
|
+
# reads READY right now (resume immediately). A MISSING key — the
|
|
2194
|
+
# entry isn't CI-parked, or the shell's live check itself could not
|
|
2195
|
+
# be made — falls through unchanged to the pre-#2182 path.
|
|
2196
|
+
live_override = (live_ci_gate or {}).get(entry.key)
|
|
2197
|
+
if live_override is not None:
|
|
2198
|
+
if live_override:
|
|
2199
|
+
continue
|
|
2200
|
+
reason = (
|
|
2201
|
+
f"live re-check of {entry.key}'s gate this tick reads READY "
|
|
2202
|
+
"(coord merge --plan agrees) — resuming from parked without "
|
|
2203
|
+
"spending an attempt (#1891, #2182)"
|
|
2204
|
+
)
|
|
2205
|
+
reconciles.append(
|
|
2206
|
+
Reconcile(
|
|
2207
|
+
entry.key,
|
|
2208
|
+
"resumed",
|
|
2209
|
+
reason,
|
|
2210
|
+
occupies=False,
|
|
2211
|
+
updates={"state": STATE_WAITING, "last_reason": reason},
|
|
2212
|
+
)
|
|
2213
|
+
)
|
|
2214
|
+
states[entry.key] = STATE_WAITING
|
|
2215
|
+
continue
|
|
2167
2216
|
# #2158: a park whose CI reading can still refresh itself is held for
|
|
2168
2217
|
# as long as it keeps saying so. One that CANNOT — the reading came
|
|
2169
2218
|
# only from the raw `merge_queue` row's frozen `error`, which is
|
|
@@ -3244,6 +3244,45 @@ def _entry_gate_status(
|
|
|
3244
3244
|
return PLAN_READY, None
|
|
3245
3245
|
|
|
3246
3246
|
|
|
3247
|
+
def entry_gate_status(
|
|
3248
|
+
entry: "QueuedMerge",
|
|
3249
|
+
board,
|
|
3250
|
+
config,
|
|
3251
|
+
ci_store: "CiStore | None" = None,
|
|
3252
|
+
gh_ops: "GhOps | None" = None,
|
|
3253
|
+
) -> tuple[str, str | None]:
|
|
3254
|
+
"""Public seam onto :func:`_entry_gate_status`, for callers outside this
|
|
3255
|
+
module that need a fresh, SINGLE-entry re-derivation of the gate — not
|
|
3256
|
+
the whole-queue :func:`plan`.
|
|
3257
|
+
|
|
3258
|
+
#2182: ``coord.drive_queue``'s park/resume machinery (#1891/#1892) used
|
|
3259
|
+
to release a `parked` entry only two ways — the cached board's own
|
|
3260
|
+
`merge_plan` reason re-deriving itself (only true off a live daemon
|
|
3261
|
+
`/board`, never on the daemon-host tick itself, which reads the local DB
|
|
3262
|
+
directly and never computes `merge_plan` at all — see
|
|
3263
|
+
``coord.commands.drive_queue._local_merge_queue_rows``), or
|
|
3264
|
+
:data:`coord.drive_queue.PARK_STALE_SECONDS` ageing the frozen reading
|
|
3265
|
+
out after 45 minutes. Both leave a genuinely-clear gate undetected for
|
|
3266
|
+
up to the ceiling, even though ``coord merge --plan`` can answer correctly on
|
|
3267
|
+
demand at any moment — the same disagreement claude-coordinator#2159
|
|
3268
|
+
surfaced (the queue read `parked` while `--plan` read READY, at the SAME
|
|
3269
|
+
instant, off the SAME board).
|
|
3270
|
+
|
|
3271
|
+
``coord.commands.drive_queue._fetch_live_ci_gate`` calls this directly,
|
|
3272
|
+
once per currently-`parked` entry, with a LIVE ``ci_store``/``gh_ops`` —
|
|
3273
|
+
the same live backend ``coord merge --plan``'s local branch builds — so
|
|
3274
|
+
the two readings can no longer disagree. Deliberately NOT routed through
|
|
3275
|
+
:func:`plan`: that function evaluates *every* PENDING queue entry with a
|
|
3276
|
+
PR, so handing it a live backend would pay for a `gh` call per entry in
|
|
3277
|
+
the whole merge queue on every 3-minute tick, not just the bounded
|
|
3278
|
+
handful currently parked — reintroducing the unbounded-`gh`-polling
|
|
3279
|
+
shape #1344 removed from the read path. A single-entry call, made only
|
|
3280
|
+
for entries already sitting in `parked`, keeps the cost exactly where
|
|
3281
|
+
the issue says it should be: small and predictable.
|
|
3282
|
+
"""
|
|
3283
|
+
return _entry_gate_status(entry, board, config, ci_store, gh_ops)
|
|
3284
|
+
|
|
3285
|
+
|
|
3247
3286
|
# ── Merge plan (#776) ────────────────────────────────────────────────────────
|
|
3248
3287
|
|
|
3249
3288
|
@dataclass
|
|
@@ -56,6 +56,21 @@ class Repo:
|
|
|
56
56
|
develop_branch: str | None = None
|
|
57
57
|
build_command: str | None = None
|
|
58
58
|
test_command: str | None = None
|
|
59
|
+
# #2091: the command this repo's CI actually runs — the "CI-equivalent"
|
|
60
|
+
# suite. The Test stage (`coord.smoke`) prefers this over
|
|
61
|
+
# `test_command`/`smoke_tests.default_command`, so a green Test verdict
|
|
62
|
+
# means the same thing a green CI run does.
|
|
63
|
+
#
|
|
64
|
+
# Why this is a SEPARATE field and not just "set test_command to the CI
|
|
65
|
+
# command": `test_command` is also what a human runs locally and what
|
|
66
|
+
# several narrower call sites use; it is routinely (and legitimately) a
|
|
67
|
+
# fast subset — coord-portal's was a ~2 min slice while CI ran a 45 min
|
|
68
|
+
# `npm run test:e2e` across two Playwright projects. That divergence is
|
|
69
|
+
# fine as long as the Test GATE runs the wider one, which is what this
|
|
70
|
+
# field declares. Leave it unset and the gate falls back to the old
|
|
71
|
+
# behaviour, but `dispatch_smoke` logs that the verdict it is about to
|
|
72
|
+
# produce is narrower than CI (see `resolve_smoke_command`).
|
|
73
|
+
ci_command: str | None = None
|
|
59
74
|
# #296: optional shell command to interactively run the app for manual
|
|
60
75
|
# smoke testing. Surfaced in the TUI Test stage detail panel so the
|
|
61
76
|
# tester knows exactly what to launch.
|