code-coordinator 0.5.56__tar.gz → 0.5.58__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.56/code_coordinator.egg-info → code_coordinator-0.5.58}/PKG-INFO +1 -1
- {code_coordinator-0.5.56 → code_coordinator-0.5.58/code_coordinator.egg-info}/PKG-INFO +1 -1
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/SOURCES.txt +5 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/scm_file_list.json +5 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/cli.py +4 -0
- code_coordinator-0.5.58/coord/commands/portal.py +120 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/config.py +118 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/db.py +8 -1
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/merge_queue.py +83 -4
- code_coordinator-0.5.58/coord/portal_bridge.py +350 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coordinator.example.yml +29 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_merge.py +20 -0
- code_coordinator-0.5.58/tests/test_cli_portal.py +163 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_db.py +73 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_merge_queue.py +147 -17
- code_coordinator-0.5.58/tests/test_portal_bridge.py +296 -0
- code_coordinator-0.5.58/tests/test_portal_config.py +124 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/tests/fixtures/board_sample.json +1 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.gitignore +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/CLAUDE.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/GOAL.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/LICENSE +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/MANIFEST.in +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/README.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/__init__.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agent.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/audit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/board_service.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/brain.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/claim.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/client.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/comments.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dao.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deps.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/drive.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/events.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/filelock.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/freshness.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/gates.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/goal.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/context.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/models.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/render.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/units.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/hooks.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/interactive.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/models.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/network.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notify.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/openapi.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/parentage.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/plans.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/progress.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/release_window.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/reports.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/review.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/smoke.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/split_work.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/state.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/test_author.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/test_report.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/usage.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/install-agent.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/pyproject.toml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/setup.cfg +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/__init__.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/conftest.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_config.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_events.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_init.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_models.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_network.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_session.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_split.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_state.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/tests/cli.rs +0 -0
|
@@ -100,6 +100,7 @@ coord/pipeline.py
|
|
|
100
100
|
coord/plan_parser.py
|
|
101
101
|
coord/plans.py
|
|
102
102
|
coord/platform_paths.py
|
|
103
|
+
coord/portal_bridge.py
|
|
103
104
|
coord/pr_body_lint.py
|
|
104
105
|
coord/prereqs.py
|
|
105
106
|
coord/progress.py
|
|
@@ -149,6 +150,7 @@ coord/commands/merge.py
|
|
|
149
150
|
coord/commands/milestone.py
|
|
150
151
|
coord/commands/plan_followup.py
|
|
151
152
|
coord/commands/plans.py
|
|
153
|
+
coord/commands/portal.py
|
|
152
154
|
coord/commands/release.py
|
|
153
155
|
coord/commands/report.py
|
|
154
156
|
coord/commands/review.py
|
|
@@ -484,6 +486,7 @@ tests/test_cli_milestone_ship.py
|
|
|
484
486
|
tests/test_cli_network.py
|
|
485
487
|
tests/test_cli_new_issue_chat.py
|
|
486
488
|
tests/test_cli_plans.py
|
|
489
|
+
tests/test_cli_portal.py
|
|
487
490
|
tests/test_cli_pull_artifact.py
|
|
488
491
|
tests/test_cli_queue.py
|
|
489
492
|
tests/test_cli_reattach_sessions.py
|
|
@@ -634,6 +637,8 @@ tests/test_plan_followup_review_command.py
|
|
|
634
637
|
tests/test_plan_only.py
|
|
635
638
|
tests/test_plan_parser.py
|
|
636
639
|
tests/test_platform_paths.py
|
|
640
|
+
tests/test_portal_bridge.py
|
|
641
|
+
tests/test_portal_config.py
|
|
637
642
|
tests/test_pr_body_lint.py
|
|
638
643
|
tests/test_prereqs.py
|
|
639
644
|
tests/test_production_db_guard.py
|
{code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"coord/commands/milestone.py",
|
|
62
62
|
"coord/commands/plan_followup.py",
|
|
63
63
|
"coord/commands/plans.py",
|
|
64
|
+
"coord/commands/portal.py",
|
|
64
65
|
"coord/commands/release.py",
|
|
65
66
|
"coord/commands/report.py",
|
|
66
67
|
"coord/commands/review.py",
|
|
@@ -272,6 +273,7 @@
|
|
|
272
273
|
"coord/plan_parser.py",
|
|
273
274
|
"coord/plans.py",
|
|
274
275
|
"coord/platform_paths.py",
|
|
276
|
+
"coord/portal_bridge.py",
|
|
275
277
|
"coord/pr_body_lint.py",
|
|
276
278
|
"coord/prereqs.py",
|
|
277
279
|
"coord/progress.py",
|
|
@@ -514,6 +516,7 @@
|
|
|
514
516
|
"tests/test_cli_network.py",
|
|
515
517
|
"tests/test_cli_new_issue_chat.py",
|
|
516
518
|
"tests/test_cli_plans.py",
|
|
519
|
+
"tests/test_cli_portal.py",
|
|
517
520
|
"tests/test_cli_pull_artifact.py",
|
|
518
521
|
"tests/test_cli_queue.py",
|
|
519
522
|
"tests/test_cli_reattach_sessions.py",
|
|
@@ -664,6 +667,8 @@
|
|
|
664
667
|
"tests/test_plan_only.py",
|
|
665
668
|
"tests/test_plan_parser.py",
|
|
666
669
|
"tests/test_platform_paths.py",
|
|
670
|
+
"tests/test_portal_bridge.py",
|
|
671
|
+
"tests/test_portal_config.py",
|
|
667
672
|
"tests/test_pr_body_lint.py",
|
|
668
673
|
"tests/test_prereqs.py",
|
|
669
674
|
"tests/test_production_db_guard.py",
|
|
@@ -87,6 +87,9 @@ from coord.health.cli import health
|
|
|
87
87
|
# #1632: same arrangement for the fleet notifier — predicate, baselines,
|
|
88
88
|
# transport seam and CLI all live in coord/notifier/.
|
|
89
89
|
from coord.notifier.cli import notifier_group
|
|
90
|
+
# #2179: coord-portal sync bridge client — coord/portal_bridge.py is the
|
|
91
|
+
# client, coord/commands/portal.py is the CLI over it.
|
|
92
|
+
from coord.commands.portal import portal_group
|
|
90
93
|
from coord.commands.merge import (
|
|
91
94
|
bounce,
|
|
92
95
|
merge,
|
|
@@ -391,6 +394,7 @@ main.add_command(gates)
|
|
|
391
394
|
main.add_command(doctor)
|
|
392
395
|
main.add_command(health)
|
|
393
396
|
main.add_command(notifier_group)
|
|
397
|
+
main.add_command(portal_group)
|
|
394
398
|
main.add_command(issue_group)
|
|
395
399
|
main.add_command(context_group)
|
|
396
400
|
main.add_command(audit)
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""``coord portal`` — exercise the coord-portal sync bridge client (#2179).
|
|
2
|
+
|
|
3
|
+
Everything that automatically decides *when* to push a status, and *which*
|
|
4
|
+
coord-side work a portal submission maps to, is out of scope here (see
|
|
5
|
+
``coord/portal_bridge.py``'s module docstring — that is follow-up work this
|
|
6
|
+
issue deliberately did not take on). What exists today is the thin client
|
|
7
|
+
plus enough CLI surface to:
|
|
8
|
+
|
|
9
|
+
* prove the credential pair actually works (``coord portal heartbeat``),
|
|
10
|
+
which is also how an operator manually verifies #2179's acceptance shape
|
|
11
|
+
end to end once ``BRIDGE_CLIENT_ID``/``BRIDGE_CLIENT_SECRET`` are set — a
|
|
12
|
+
submission's ``/deliveries`` row going ``queued`` → ``sent`` in production
|
|
13
|
+
is only reachable at all once something has pushed a status; and
|
|
14
|
+
* push one status update by hand (``coord portal push``), so a submission's
|
|
15
|
+
status can be moved even before anything automatic drives it.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
|
|
22
|
+
import click
|
|
23
|
+
|
|
24
|
+
from coord.commands._common import _CONFIG_OPTION, _load_config
|
|
25
|
+
from coord.portal_bridge import (
|
|
26
|
+
PortalBridgeError,
|
|
27
|
+
SUBMISSION_STATUSES,
|
|
28
|
+
client_from_config,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@click.group("portal")
|
|
33
|
+
def portal_group() -> None:
|
|
34
|
+
"""coord-portal sync bridge — status, manual push, heartbeat (#2179)."""
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@portal_group.command("status")
|
|
38
|
+
@_CONFIG_OPTION
|
|
39
|
+
@click.option("--json", "as_json", is_flag=True, default=False)
|
|
40
|
+
def portal_status(config_path, as_json: bool) -> None:
|
|
41
|
+
"""Show whether the portal bridge is configured, without sending anything."""
|
|
42
|
+
cfg = _load_config(config_path).portal
|
|
43
|
+
payload = {
|
|
44
|
+
"enabled": cfg.enabled,
|
|
45
|
+
"base_url": cfg.base_url,
|
|
46
|
+
"credentials_set": bool(cfg.bridge_client_id and cfg.bridge_client_secret),
|
|
47
|
+
"timeout_secs": cfg.timeout_secs,
|
|
48
|
+
"max_retries": cfg.max_retries,
|
|
49
|
+
}
|
|
50
|
+
if as_json:
|
|
51
|
+
click.echo(json.dumps(payload, indent=2, sort_keys=True))
|
|
52
|
+
return
|
|
53
|
+
if not cfg.enabled:
|
|
54
|
+
click.echo("portal: disabled (no 'portal:' block, or portal.enabled: false)")
|
|
55
|
+
return
|
|
56
|
+
click.echo(f"portal: ENABLED base_url={cfg.base_url} "
|
|
57
|
+
f"credentials={'set' if payload['credentials_set'] else 'MISSING'}")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@portal_group.command("heartbeat")
|
|
61
|
+
@_CONFIG_OPTION
|
|
62
|
+
def portal_heartbeat(config_path) -> None:
|
|
63
|
+
"""Send one heartbeat, proving the credential pair and base_url work.
|
|
64
|
+
|
|
65
|
+
Exits non-zero on failure — a 401 here means BRIDGE_CLIENT_ID/SECRET on
|
|
66
|
+
this side do not match what the portal has (or Cloudflare Access is
|
|
67
|
+
rejecting the request before it even gets there).
|
|
68
|
+
"""
|
|
69
|
+
cfg = _load_config(config_path).portal
|
|
70
|
+
client = client_from_config(cfg)
|
|
71
|
+
if client is None:
|
|
72
|
+
click.secho(
|
|
73
|
+
"portal is not enabled — nothing to do (see `coord portal status`)",
|
|
74
|
+
fg="yellow",
|
|
75
|
+
)
|
|
76
|
+
raise SystemExit(1)
|
|
77
|
+
try:
|
|
78
|
+
ok = client.heartbeat()
|
|
79
|
+
except PortalBridgeError as exc:
|
|
80
|
+
click.secho(f"heartbeat failed: {exc}", fg="red")
|
|
81
|
+
raise SystemExit(1) from exc
|
|
82
|
+
if ok:
|
|
83
|
+
click.secho("heartbeat sent", fg="green")
|
|
84
|
+
return
|
|
85
|
+
click.secho("heartbeat sent but portal did not confirm 'ok'", fg="red")
|
|
86
|
+
raise SystemExit(1)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@portal_group.command("push")
|
|
90
|
+
@_CONFIG_OPTION
|
|
91
|
+
@click.argument("submission_id")
|
|
92
|
+
@click.argument("revision", type=int)
|
|
93
|
+
@click.argument("status", type=click.Choice(SUBMISSION_STATUSES))
|
|
94
|
+
def portal_push(config_path, submission_id: str, revision: int, status: str) -> None:
|
|
95
|
+
"""Push one status update by hand: SUBMISSION_ID REVISION STATUS.
|
|
96
|
+
|
|
97
|
+
REVISION must be strictly greater than whatever the portal last accepted
|
|
98
|
+
for this submission, or the push comes back `already_applied` (a
|
|
99
|
+
success, not an error — see coord-portal's src/bridge/updates.ts).
|
|
100
|
+
"""
|
|
101
|
+
cfg = _load_config(config_path).portal
|
|
102
|
+
client = client_from_config(cfg)
|
|
103
|
+
if client is None:
|
|
104
|
+
click.secho(
|
|
105
|
+
"portal is not enabled — nothing to do (see `coord portal status`)",
|
|
106
|
+
fg="yellow",
|
|
107
|
+
)
|
|
108
|
+
raise SystemExit(1)
|
|
109
|
+
try:
|
|
110
|
+
result = client.push_status(submission_id, revision, status)
|
|
111
|
+
except PortalBridgeError as exc:
|
|
112
|
+
click.secho(f"push failed: {exc}", fg="red")
|
|
113
|
+
raise SystemExit(1) from exc
|
|
114
|
+
if result.ok:
|
|
115
|
+
click.secho(f"{result.outcome}: {submission_id}@{revision} -> {status}", fg="green")
|
|
116
|
+
return
|
|
117
|
+
click.secho(
|
|
118
|
+
f"rejected: {submission_id}@{revision} -> {status} ({result.reason})", fg="red"
|
|
119
|
+
)
|
|
120
|
+
raise SystemExit(1)
|
|
@@ -1671,6 +1671,41 @@ class NotificationsConfig:
|
|
|
1671
1671
|
cold_ceiling_mins: dict[str, float] = field(default_factory=dict)
|
|
1672
1672
|
|
|
1673
1673
|
|
|
1674
|
+
@dataclass
|
|
1675
|
+
class PortalConfig:
|
|
1676
|
+
"""The outbound client to coord-portal's sync bridge (#2179, ``docs/CUSTOMER_PORTAL.md``).
|
|
1677
|
+
|
|
1678
|
+
Absent block == disabled == coord never talks to the portal — unchanged
|
|
1679
|
+
behaviour for every existing deployment, and the correct default until
|
|
1680
|
+
``BRIDGE_CLIENT_ID``/``BRIDGE_CLIENT_SECRET`` actually exist in production
|
|
1681
|
+
(they do not, as of #2179: ``wrangler secret list`` on the portal has no
|
|
1682
|
+
entry for either).
|
|
1683
|
+
|
|
1684
|
+
The portal is a third party from coord's perspective — a push failure
|
|
1685
|
+
must be retried and surfaced, never fatal to a merge or a dispatch.
|
|
1686
|
+
Nothing in :mod:`coord.portal_bridge` sits on the dispatch path; it is a
|
|
1687
|
+
client other code calls, not a check anything blocks on.
|
|
1688
|
+
"""
|
|
1689
|
+
|
|
1690
|
+
enabled: bool = False
|
|
1691
|
+
# e.g. "https://intake.heurontech.com". No default: a client pointed at
|
|
1692
|
+
# nothing by accident is worse than one that refuses to start.
|
|
1693
|
+
base_url: str | None = None
|
|
1694
|
+
# The Cloudflare Access service-token pair coord-portal's
|
|
1695
|
+
# ``isBridgeAuthorized`` requires as a matched, non-empty pair (half a
|
|
1696
|
+
# credential is not a credential, and it fails closed on exactly that).
|
|
1697
|
+
# Support ``${VAR}`` expansion (mirrors ``providers.definitions[*].env``)
|
|
1698
|
+
# so the real secret lives in the environment, never committed in
|
|
1699
|
+
# coordinator.yml.
|
|
1700
|
+
bridge_client_id: str | None = None
|
|
1701
|
+
bridge_client_secret: str | None = None
|
|
1702
|
+
timeout_secs: float = 10.0
|
|
1703
|
+
# Retries are for transient/5xx failures only — see
|
|
1704
|
+
# coord.portal_bridge.PortalBridgeClient. A 401 never retries: a bad
|
|
1705
|
+
# credential does not become a good one on attempt two.
|
|
1706
|
+
max_retries: int = 2
|
|
1707
|
+
|
|
1708
|
+
|
|
1674
1709
|
@dataclass
|
|
1675
1710
|
class Config:
|
|
1676
1711
|
repos: list[Repo]
|
|
@@ -1695,6 +1730,8 @@ class Config:
|
|
|
1695
1730
|
health: HealthConfig = field(default_factory=HealthConfig)
|
|
1696
1731
|
# #1632 — absent block == disabled == today's behaviour (silence).
|
|
1697
1732
|
notifications: NotificationsConfig = field(default_factory=NotificationsConfig)
|
|
1733
|
+
# #2179 — absent block == disabled == coord never talks to coord-portal.
|
|
1734
|
+
portal: PortalConfig = field(default_factory=PortalConfig)
|
|
1698
1735
|
path: Path | None = None
|
|
1699
1736
|
|
|
1700
1737
|
def repo(self, name: str) -> Repo | None:
|
|
@@ -1767,6 +1804,7 @@ def parse_mapping(raw: Any, *, path: Path | None = None) -> Config:
|
|
|
1767
1804
|
pricing = _parse_pricing(raw.get("pricing"))
|
|
1768
1805
|
health = _parse_health(raw.get("health"))
|
|
1769
1806
|
notifications = _parse_notifications(raw.get("notifications"))
|
|
1807
|
+
portal = _parse_portal(raw.get("portal"))
|
|
1770
1808
|
|
|
1771
1809
|
return Config(
|
|
1772
1810
|
repos=repos,
|
|
@@ -1789,6 +1827,7 @@ def parse_mapping(raw: Any, *, path: Path | None = None) -> Config:
|
|
|
1789
1827
|
pricing=pricing,
|
|
1790
1828
|
health=health,
|
|
1791
1829
|
notifications=notifications,
|
|
1830
|
+
portal=portal,
|
|
1792
1831
|
path=p,
|
|
1793
1832
|
)
|
|
1794
1833
|
|
|
@@ -3239,6 +3278,85 @@ def _expand_env_vars(value: str) -> str:
|
|
|
3239
3278
|
return _ENV_VAR_RE.sub(_replace, value)
|
|
3240
3279
|
|
|
3241
3280
|
|
|
3281
|
+
_PORTAL_PLAIN_STR_FIELDS = ("base_url",)
|
|
3282
|
+
_PORTAL_SECRET_STR_FIELDS = ("bridge_client_id", "bridge_client_secret")
|
|
3283
|
+
|
|
3284
|
+
|
|
3285
|
+
def _parse_portal(raw: Any) -> PortalConfig:
|
|
3286
|
+
"""Parse the optional ``portal:`` block from coordinator.yml (#2179).
|
|
3287
|
+
|
|
3288
|
+
An absent block returns a **disabled** :class:`PortalConfig` — unchanged
|
|
3289
|
+
behaviour for every existing deployment, and the correct default until
|
|
3290
|
+
``BRIDGE_CLIENT_ID``/``BRIDGE_CLIENT_SECRET`` exist in production.
|
|
3291
|
+
"""
|
|
3292
|
+
if raw is None:
|
|
3293
|
+
return PortalConfig()
|
|
3294
|
+
if not isinstance(raw, dict):
|
|
3295
|
+
raise ConfigError("'portal' must be a mapping")
|
|
3296
|
+
|
|
3297
|
+
cfg = PortalConfig()
|
|
3298
|
+
known = {f.name for f in fields(PortalConfig)}
|
|
3299
|
+
unknown = sorted(set(raw) - known)
|
|
3300
|
+
if unknown:
|
|
3301
|
+
raise ConfigError(
|
|
3302
|
+
f"unknown portal option(s): {', '.join(unknown)} "
|
|
3303
|
+
f"(valid: {', '.join(sorted(known))})"
|
|
3304
|
+
)
|
|
3305
|
+
|
|
3306
|
+
if "enabled" in raw:
|
|
3307
|
+
if not isinstance(raw["enabled"], bool):
|
|
3308
|
+
raise ConfigError("portal.enabled must be a boolean")
|
|
3309
|
+
cfg.enabled = raw["enabled"]
|
|
3310
|
+
|
|
3311
|
+
for key in _PORTAL_PLAIN_STR_FIELDS:
|
|
3312
|
+
if key in raw:
|
|
3313
|
+
value = raw[key]
|
|
3314
|
+
if value is not None and not isinstance(value, str):
|
|
3315
|
+
raise ConfigError(f"portal.{key} must be a string or null")
|
|
3316
|
+
if isinstance(value, str) and not value.strip():
|
|
3317
|
+
raise ConfigError(f"portal.{key} must be a non-empty string or null")
|
|
3318
|
+
setattr(cfg, key, value.strip().rstrip("/") if isinstance(value, str) else None)
|
|
3319
|
+
|
|
3320
|
+
for key in _PORTAL_SECRET_STR_FIELDS:
|
|
3321
|
+
if key in raw:
|
|
3322
|
+
value = raw[key]
|
|
3323
|
+
if value is not None and not isinstance(value, str):
|
|
3324
|
+
raise ConfigError(f"portal.{key} must be a string or null")
|
|
3325
|
+
if isinstance(value, str):
|
|
3326
|
+
# ${VAR} expansion (mirrors providers.definitions[*].env) so the
|
|
3327
|
+
# real secret lives in the environment, never committed here —
|
|
3328
|
+
# coordinator.yml is public-repo-adjacent operator config, and
|
|
3329
|
+
# these two values are exactly what coord-portal is public
|
|
3330
|
+
# about NOT holding on its own side of the boundary.
|
|
3331
|
+
value = _expand_env_vars(value).strip()
|
|
3332
|
+
if not value:
|
|
3333
|
+
raise ConfigError(f"portal.{key} must be a non-empty string or null")
|
|
3334
|
+
setattr(cfg, key, value if isinstance(value, str) else None)
|
|
3335
|
+
|
|
3336
|
+
if "timeout_secs" in raw:
|
|
3337
|
+
value = raw["timeout_secs"]
|
|
3338
|
+
if isinstance(value, bool) or not isinstance(value, (int, float)) or value <= 0:
|
|
3339
|
+
raise ConfigError("portal.timeout_secs must be a positive number")
|
|
3340
|
+
cfg.timeout_secs = float(value)
|
|
3341
|
+
|
|
3342
|
+
if "max_retries" in raw:
|
|
3343
|
+
value = raw["max_retries"]
|
|
3344
|
+
if isinstance(value, bool) or not isinstance(value, int) or value < 0:
|
|
3345
|
+
raise ConfigError("portal.max_retries must be a non-negative integer")
|
|
3346
|
+
cfg.max_retries = value
|
|
3347
|
+
|
|
3348
|
+
if cfg.enabled and not (cfg.base_url and cfg.bridge_client_id and cfg.bridge_client_secret):
|
|
3349
|
+
# Half a credential is not a credential — coord-portal's
|
|
3350
|
+
# isBridgeAuthorized takes the identical position and fails closed on
|
|
3351
|
+
# exactly this. Refuse at parse time rather than 401-looping forever.
|
|
3352
|
+
raise ConfigError(
|
|
3353
|
+
"portal.enabled is true but base_url/bridge_client_id/bridge_client_secret "
|
|
3354
|
+
"are not all set"
|
|
3355
|
+
)
|
|
3356
|
+
|
|
3357
|
+
return cfg
|
|
3358
|
+
|
|
3359
|
+
|
|
3242
3360
|
def _parse_providers(raw: Any) -> ProvidersConfig:
|
|
3243
3361
|
"""Parse the optional ``providers:`` block from coordinator.yml.
|
|
3244
3362
|
|
|
@@ -188,7 +188,8 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
|
|
|
188
188
|
enqueued_at REAL,
|
|
189
189
|
assignment_type TEXT DEFAULT 'work',
|
|
190
190
|
required_gates TEXT,
|
|
191
|
-
ci_infra_reruns INTEGER NOT NULL DEFAULT 0
|
|
191
|
+
ci_infra_reruns INTEGER NOT NULL DEFAULT 0,
|
|
192
|
+
ci_stale_reruns INTEGER NOT NULL DEFAULT 0
|
|
192
193
|
);
|
|
193
194
|
|
|
194
195
|
CREATE TABLE IF NOT EXISTS plans (
|
|
@@ -697,6 +698,12 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
|
|
|
697
698
|
# predating this column (no auto-reruns spent yet), same as the
|
|
698
699
|
# column's own default for freshly-enqueued entries.
|
|
699
700
|
"ALTER TABLE merge_queue ADD COLUMN ci_infra_reruns INTEGER NOT NULL DEFAULT 0",
|
|
701
|
+
# #2197: the CI-staleness auto-rerun's OWN counter — see
|
|
702
|
+
# `coord.merge_queue.MAX_CI_STALE_RERUNS` and
|
|
703
|
+
# `QueuedMerge.ci_stale_reruns`'s docstring for why it is kept
|
|
704
|
+
# separate from `ci_infra_reruns` rather than sharing it. 0 for
|
|
705
|
+
# every row predating this column, same as a freshly-enqueued entry.
|
|
706
|
+
"ALTER TABLE merge_queue ADD COLUMN ci_stale_reruns INTEGER NOT NULL DEFAULT 0",
|
|
700
707
|
# #1956: verdict provenance — WHO recorded `review_verdict` and HOW
|
|
701
708
|
# (see coord.models.Assignment.verdict_source for the three values
|
|
702
709
|
# and why conflating them was the second half of #1956). NULL for
|
|
@@ -1417,6 +1417,19 @@ def is_ci_infra_reason(reason: str | None) -> bool:
|
|
|
1417
1417
|
# standing breakage.
|
|
1418
1418
|
MAX_CI_INFRA_RERUNS = 2
|
|
1419
1419
|
|
|
1420
|
+
# #2197: same shape as MAX_CI_INFRA_RERUNS above, but for the OTHER CI
|
|
1421
|
+
# auto-rerun trigger `process()` supports — a PASSING check recorded against
|
|
1422
|
+
# a base that has since moved (:data:`CI_STALE_PREFIX`, #1851's staleness
|
|
1423
|
+
# signal), not a failure. Deliberately a SEPARATE constant/counter from
|
|
1424
|
+
# `ci_infra_reruns`: the two triggers answer opposite readings of CI ("this
|
|
1425
|
+
# failed and needs to prove itself again" vs. "this passed but predates the
|
|
1426
|
+
# base and needs a fresh answer") and must be independently capped and
|
|
1427
|
+
# independently legible in the audit trail. A base that keeps moving out
|
|
1428
|
+
# from under one PR (a busy queue, or a genuinely wedged branch) would
|
|
1429
|
+
# otherwise auto-rerun forever; two tries rides out an ordinary busy tick
|
|
1430
|
+
# without masking a PR that just isn't going to catch up unattended.
|
|
1431
|
+
MAX_CI_STALE_RERUNS = 2
|
|
1432
|
+
|
|
1420
1433
|
|
|
1421
1434
|
def _ci_infra_reason(
|
|
1422
1435
|
ci: "CiStore", repo: str, number: int, failed: "list[CheckRun]"
|
|
@@ -2168,6 +2181,15 @@ class QueuedMerge:
|
|
|
2168
2181
|
# forever. 0 for every entry that has never hit a verdictless failure,
|
|
2169
2182
|
# and for rows predating this column.
|
|
2170
2183
|
ci_infra_reruns: int = 0
|
|
2184
|
+
# #2197: count of automatic `CiStore.rerun_for_pr` calls `process()` has
|
|
2185
|
+
# issued for this entry's CURRENT run of CI staleness (#1851) — a
|
|
2186
|
+
# PASSING check recorded against a base that has since moved. Kept
|
|
2187
|
+
# separate from `ci_infra_reruns` above on purpose (see
|
|
2188
|
+
# `MAX_CI_STALE_RERUNS`'s comment): the two triggers must be
|
|
2189
|
+
# independently capped and independently legible in the audit trail.
|
|
2190
|
+
# Capped at `MAX_CI_STALE_RERUNS`. 0 for every entry that has never gone
|
|
2191
|
+
# CI-stale, and for rows predating this column.
|
|
2192
|
+
ci_stale_reruns: int = 0
|
|
2171
2193
|
|
|
2172
2194
|
|
|
2173
2195
|
class GhOps(Protocol):
|
|
@@ -2459,6 +2481,9 @@ def load_queue() -> list[QueuedMerge]:
|
|
|
2459
2481
|
# #1892: column added via migration; NULL (pre-migration rows)
|
|
2460
2482
|
# decodes to 0 — no auto-reruns spent yet, same as a fresh entry.
|
|
2461
2483
|
ci_infra_reruns=row["ci_infra_reruns"] or 0,
|
|
2484
|
+
# #2197: same NULL-to-0 decoding as ci_infra_reruns above, for
|
|
2485
|
+
# rows predating this column.
|
|
2486
|
+
ci_stale_reruns=row["ci_stale_reruns"] or 0,
|
|
2462
2487
|
)
|
|
2463
2488
|
for row in rows
|
|
2464
2489
|
]
|
|
@@ -2475,15 +2500,16 @@ def save_queue(items: list[QueuedMerge]) -> None:
|
|
|
2475
2500
|
assignment_id, repo_name, repo_github, branch,
|
|
2476
2501
|
target_branch, issue_number, issue_title, state,
|
|
2477
2502
|
pr_number, pr_url, size, last_attempt, error, enqueued_at,
|
|
2478
|
-
assignment_type, required_gates, ci_infra_reruns
|
|
2479
|
-
|
|
2503
|
+
assignment_type, required_gates, ci_infra_reruns,
|
|
2504
|
+
ci_stale_reruns
|
|
2505
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
|
2480
2506
|
(
|
|
2481
2507
|
item.assignment_id, item.repo_name, item.repo_github,
|
|
2482
2508
|
item.branch, item.target_branch, item.issue_number,
|
|
2483
2509
|
item.issue_title, item.state, item.pr_number, item.pr_url,
|
|
2484
2510
|
item.size, item.last_attempt, item.error, item.enqueued_at,
|
|
2485
2511
|
item.assignment_type, json.dumps(list(item.required_gates or [])),
|
|
2486
|
-
item.ci_infra_reruns,
|
|
2512
|
+
item.ci_infra_reruns, item.ci_stale_reruns,
|
|
2487
2513
|
),
|
|
2488
2514
|
)
|
|
2489
2515
|
|
|
@@ -4503,16 +4529,69 @@ def process(
|
|
|
4503
4529
|
# distinctly (`checks_stale`) from checks_failed/
|
|
4504
4530
|
# checks_pending above so an operator (and `coord merge
|
|
4505
4531
|
# --revalidate`, the remedy) can tell the three apart.
|
|
4532
|
+
#
|
|
4533
|
+
# #2197: this used to always block here, escalating to a
|
|
4534
|
+
# human (or, via `coord drive`, spending a merge attempt)
|
|
4535
|
+
# for a condition a re-run resolves on its own — the exact
|
|
4536
|
+
# #2170 regression (a docs-only base move stales a
|
|
4537
|
+
# perfectly good green PR). Mirror #1892's shape exactly:
|
|
4538
|
+
# auto-rerun via the SAME `CiStore.rerun_for_pr` this
|
|
4539
|
+
# module already calls unattended for verdictless
|
|
4540
|
+
# failures, up to `MAX_CI_STALE_RERUNS` — but track it
|
|
4541
|
+
# with its OWN counter (`ci_stale_reruns`), never
|
|
4542
|
+
# `ci_infra_reruns`, so a failed-then-stale (or
|
|
4543
|
+
# stale-then-failed) PR does not have one trigger silently
|
|
4544
|
+
# spend the other's budget, and so the audit trail can
|
|
4545
|
+
# always tell which condition an auto-rerun was answering.
|
|
4506
4546
|
if checks and _ci_checks_are_stale(
|
|
4507
4547
|
checks, gh_ops, entry.repo_github, entry.target_branch, smoke,
|
|
4508
4548
|
):
|
|
4549
|
+
if entry.ci_stale_reruns < MAX_CI_STALE_RERUNS:
|
|
4550
|
+
entry.ci_stale_reruns += 1
|
|
4551
|
+
reran = ci.rerun_for_pr(entry.repo_github, entry.pr_number)
|
|
4552
|
+
_log.info(
|
|
4553
|
+
"#2197 auto-rerun %d/%d for stale CI on %s#%d "
|
|
4554
|
+
"(PR #%s) (rerun_for_pr %s)",
|
|
4555
|
+
entry.ci_stale_reruns, MAX_CI_STALE_RERUNS,
|
|
4556
|
+
entry.repo_name, entry.issue_number,
|
|
4557
|
+
entry.pr_number,
|
|
4558
|
+
"triggered" if reran else "FAILED",
|
|
4559
|
+
)
|
|
4560
|
+
# #1891: same `CI_PENDING_PREFIX` wording the
|
|
4561
|
+
# genuinely-still-running case uses above — this is
|
|
4562
|
+
# what lets `coord drive`'s `is_ci_pending_reason`
|
|
4563
|
+
# check (coord/drive.py) treat a re-run THIS auto-
|
|
4564
|
+
# trigger just kicked off exactly like any other
|
|
4565
|
+
# in-flight CI: a bare wait, never a spent merge
|
|
4566
|
+
# attempt. The queue resumes it automatically once
|
|
4567
|
+
# the re-run reports, no operator needed.
|
|
4568
|
+
msg = (
|
|
4569
|
+
f"{CI_PENDING_PREFIX} re-run triggered for CI "
|
|
4570
|
+
"checks that predate the current base (#2197 "
|
|
4571
|
+
f"auto-rerun {entry.ci_stale_reruns}/"
|
|
4572
|
+
f"{MAX_CI_STALE_RERUNS} "
|
|
4573
|
+
f"{'triggered' if reran else 'failed to trigger'})"
|
|
4574
|
+
)
|
|
4575
|
+
entry.error = msg
|
|
4576
|
+
events.append(MergeEvent(entry, "checks_stale_rerun", msg))
|
|
4577
|
+
continue # #292: skip, don't halt the group
|
|
4509
4578
|
msg = (
|
|
4510
4579
|
f"{CI_STALE_PREFIX} checks predate the current base "
|
|
4511
|
-
"—
|
|
4580
|
+
f"— auto-rerun budget exhausted ({entry.ci_stale_reruns}/"
|
|
4581
|
+
f"{MAX_CI_STALE_RERUNS}); re-run CI (`coord merge "
|
|
4582
|
+
"--revalidate`) before merging"
|
|
4512
4583
|
)
|
|
4513
4584
|
entry.error = msg
|
|
4514
4585
|
events.append(MergeEvent(entry, "checks_stale", msg))
|
|
4515
4586
|
continue # #292: skip, don't halt the group
|
|
4587
|
+
# #2197: reached only once the checks are genuinely fresh
|
|
4588
|
+
# (or the smoke-side #1738/#1778/#1847 base-move exemption
|
|
4589
|
+
# spared them) — mirrors the `ci_infra_reruns = 0` reset
|
|
4590
|
+
# above and for the identical reason: whatever staleness
|
|
4591
|
+
# streak the budget was tracking has now actually resolved,
|
|
4592
|
+
# so a LATER base move starts its own budget from zero
|
|
4593
|
+
# rather than inheriting an unrelated exhausted count.
|
|
4594
|
+
entry.ci_stale_reruns = 0
|
|
4516
4595
|
# #1318: cache is_epic_issue lookups for this entry — the same
|
|
4517
4596
|
# referenced number can show up in both the PR body and one or
|
|
4518
4597
|
# more commit messages below, and each lookup is a `gh` round
|