code-coordinator 0.5.88__tar.gz → 0.5.89__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.88 → code_coordinator-0.5.89}/PKG-INFO +1 -1
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/PKG-INFO +1 -1
- code_coordinator-0.5.89/code_coordinator.egg-info/scm_version.json +8 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/ci_github.py +35 -1
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/ci_store.py +30 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/db.py +12 -1
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/drive.py +30 -5
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/drive_queue.py +39 -6
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/drive_state.py +16 -1
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/github_ops.py +26 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/merge_queue.py +184 -2
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_ci_store.py +117 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_db.py +81 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_drive.py +69 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_drive_queue.py +59 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_drive_state.py +37 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_github_ops.py +41 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_merge_queue.py +227 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/tests/fixtures/board_sample.json +2 -0
- code_coordinator-0.5.88/code_coordinator.egg-info/scm_version.json +0 -8
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.gitignore +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/CLAUDE.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/GOAL.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/LICENSE +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/MANIFEST.in +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/README.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/__init__.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agent.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/audit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/board_service.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/brain.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/claim.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/cli.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/client.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/comments.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/config.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dao.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deps.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/events.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/filelock.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/freshness.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/gates.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/goal.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/context.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/models.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/render.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/units.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/hooks.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/interactive.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/models.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/network.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notify.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/openapi.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/parentage.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/plans.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/progress.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/release_window.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/reports.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/review.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/smoke.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/split_work.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/state.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/test_author.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/test_report.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/usage.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/install-agent.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/pyproject.toml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/setup.cfg +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/__init__.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/conftest.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_config.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_events.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_init.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_models.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_network.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_session.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_split.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_state.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/tests/cli.rs +0 -0
|
@@ -18,7 +18,7 @@ from dataclasses import dataclass, field
|
|
|
18
18
|
from datetime import datetime
|
|
19
19
|
|
|
20
20
|
from coord import github_ops
|
|
21
|
-
from coord.ci_store import CheckRun, JobRun, JobStep
|
|
21
|
+
from coord.ci_store import CheckRun, JobRun, JobStep, failed_checks
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
def _parse_ts(raw: str | None) -> float | None:
|
|
@@ -236,6 +236,40 @@ class GitHubCi:
|
|
|
236
236
|
self._jobs_cache.pop((repo, str(run_id)), None)
|
|
237
237
|
return all_ok and any_ok
|
|
238
238
|
|
|
239
|
+
def rerun_failed_for_pr(self, repo: str, number: int) -> bool:
|
|
240
|
+
"""Re-run only the FAILING job(s) behind *repo*#*number*'s current
|
|
241
|
+
checks via ``gh run rerun <id> --failed`` (#2252).
|
|
242
|
+
|
|
243
|
+
Same shape as :meth:`rerun_for_pr` above, narrowed to the run ids
|
|
244
|
+
behind :func:`coord.ci_store.failed_checks` rather than every run id
|
|
245
|
+
among the PR's checks — a passing check's run is left untouched, so
|
|
246
|
+
the caller's #2252 flake re-check can't accidentally spend CI
|
|
247
|
+
minutes re-proving a check that already reported green, and the
|
|
248
|
+
green evidence itself (timestamps, logs) survives intact for the
|
|
249
|
+
board to keep showing.
|
|
250
|
+
|
|
251
|
+
Same best-effort / return-value / cache-invalidation contract as
|
|
252
|
+
`rerun_for_pr`: ``True`` only when at least one run id was found
|
|
253
|
+
among the currently-failing checks *and* every ``gh run rerun
|
|
254
|
+
--failed`` call issued exited zero.
|
|
255
|
+
"""
|
|
256
|
+
checks = self.list_checks_for_pr(repo, number)
|
|
257
|
+
run_ids = sorted({c.run_id for c in failed_checks(checks) if c.run_id})
|
|
258
|
+
if not run_ids:
|
|
259
|
+
return False
|
|
260
|
+
all_ok = True
|
|
261
|
+
any_ok = False
|
|
262
|
+
for run_id in run_ids:
|
|
263
|
+
if github_ops.rerun_workflow_run_failed(repo, run_id):
|
|
264
|
+
any_ok = True
|
|
265
|
+
else:
|
|
266
|
+
all_ok = False
|
|
267
|
+
if any_ok:
|
|
268
|
+
self.invalidate(repo, number)
|
|
269
|
+
for run_id in run_ids:
|
|
270
|
+
self._jobs_cache.pop((repo, str(run_id)), None)
|
|
271
|
+
return all_ok and any_ok
|
|
272
|
+
|
|
239
273
|
def list_jobs_for_run(self, repo: str, run_id: str) -> list["JobRun"]:
|
|
240
274
|
"""Job/step detail for Actions run *run_id* on *repo* via ``gh api``
|
|
241
275
|
(#1892) — backs :func:`coord.ci_store.is_verdictless_job`.
|
|
@@ -195,6 +195,31 @@ class CiStore(Protocol):
|
|
|
195
195
|
"""
|
|
196
196
|
...
|
|
197
197
|
|
|
198
|
+
def rerun_failed_for_pr(self, repo: str, number: int) -> bool:
|
|
199
|
+
"""Re-run ONLY the currently-failing job(s) behind *repo*#*number*'s
|
|
200
|
+
checks (#2252). Returns whether it worked.
|
|
201
|
+
|
|
202
|
+
Narrower than :meth:`rerun_for_pr`, which reruns every distinct
|
|
203
|
+
Actions run id behind ALL of a PR's checks — passing ones included.
|
|
204
|
+
Re-running the whole run would also re-trigger jobs that already
|
|
205
|
+
reported green, discarding that first-pass evidence for nothing:
|
|
206
|
+
#2252 asks "is the RED one flaky?", not "run the suite again", and
|
|
207
|
+
wants the answer without paying for (or risking a second read of)
|
|
208
|
+
checks that already settled.
|
|
209
|
+
|
|
210
|
+
This is the mechanism behind :mod:`coord.merge_queue`'s one-shot
|
|
211
|
+
flake re-check (``MAX_CI_FLAKY_RERUNS`` — deliberately ONE re-run,
|
|
212
|
+
not a retry loop: two independent observations is the whole ask).
|
|
213
|
+
Call sites duck-type via ``getattr(ci, "rerun_failed_for_pr",
|
|
214
|
+
None)`` so a `CiStore` stand-in that predates this capability (most
|
|
215
|
+
duck-typed test stubs, :class:`coord.gate_snapshot.GateSnapshot`)
|
|
216
|
+
simply doesn't offer it — read as "could not trigger a re-run",
|
|
217
|
+
the same fail-safe fallback an actual `gh` failure produces (#2252:
|
|
218
|
+
"if the re-run cannot be triggered, fall back to today's
|
|
219
|
+
behaviour").
|
|
220
|
+
"""
|
|
221
|
+
...
|
|
222
|
+
|
|
198
223
|
|
|
199
224
|
class NoOpCi:
|
|
200
225
|
"""Always-available fallback that returns no checks and reruns nothing.
|
|
@@ -226,6 +251,11 @@ class NoOpCi:
|
|
|
226
251
|
detail to fetch (#1892)."""
|
|
227
252
|
return []
|
|
228
253
|
|
|
254
|
+
def rerun_failed_for_pr(self, repo: str, number: int) -> bool:
|
|
255
|
+
"""No-op: CI gating is disabled entirely, so there is nothing to
|
|
256
|
+
re-run (#2252)."""
|
|
257
|
+
return False
|
|
258
|
+
|
|
229
259
|
|
|
230
260
|
# ── Classification helpers ──────────────────────────────────────────────────
|
|
231
261
|
|
|
@@ -189,7 +189,9 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
|
|
|
189
189
|
assignment_type TEXT DEFAULT 'work',
|
|
190
190
|
required_gates TEXT,
|
|
191
191
|
ci_infra_reruns INTEGER NOT NULL DEFAULT 0,
|
|
192
|
-
ci_stale_reruns INTEGER NOT NULL DEFAULT 0
|
|
192
|
+
ci_stale_reruns INTEGER NOT NULL DEFAULT 0,
|
|
193
|
+
ci_flaky_reruns INTEGER NOT NULL DEFAULT 0,
|
|
194
|
+
ci_flaky_pending TEXT NOT NULL DEFAULT ''
|
|
193
195
|
);
|
|
194
196
|
|
|
195
197
|
CREATE TABLE IF NOT EXISTS plans (
|
|
@@ -857,6 +859,15 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
|
|
|
857
859
|
# 0 for every row predating this migration, same as the column's own
|
|
858
860
|
# default for a freshly-enqueued entry.
|
|
859
861
|
"ALTER TABLE drive_queue ADD COLUMN resumes INTEGER NOT NULL DEFAULT 0",
|
|
862
|
+
# #2252: the flake-recheck auto-rerun's OWN counter/pending-state —
|
|
863
|
+
# see `coord.merge_queue.MAX_CI_FLAKY_RERUNS` and
|
|
864
|
+
# `QueuedMerge.ci_flaky_reruns`/`ci_flaky_pending`'s docstrings for
|
|
865
|
+
# why they're kept separate from `ci_infra_reruns`/`ci_stale_reruns`
|
|
866
|
+
# above rather than sharing either. 0/'' for every row predating
|
|
867
|
+
# this migration — no flake re-run ever spent/pending — same as the
|
|
868
|
+
# columns' own defaults for a freshly-enqueued entry.
|
|
869
|
+
"ALTER TABLE merge_queue ADD COLUMN ci_flaky_reruns INTEGER NOT NULL DEFAULT 0",
|
|
870
|
+
"ALTER TABLE merge_queue ADD COLUMN ci_flaky_pending TEXT NOT NULL DEFAULT ''",
|
|
860
871
|
]
|
|
861
872
|
for sql in migrations:
|
|
862
873
|
try:
|
|
@@ -130,6 +130,7 @@ from coord.worker_events import is_usage_limit_reason
|
|
|
130
130
|
# See `_STALE_SMOKE_MARKERS` / `_is_stale_smoke_reason` below.
|
|
131
131
|
from coord.merge_queue import (
|
|
132
132
|
STALE_SMOKE_MARKERS as _mq_stale_smoke_markers,
|
|
133
|
+
is_ci_flaky_reason,
|
|
133
134
|
is_ci_infra_reason,
|
|
134
135
|
is_ci_pending_reason,
|
|
135
136
|
is_stale_smoke_reason as _mq_is_stale_smoke_reason,
|
|
@@ -2513,9 +2514,10 @@ def _effective_merge_gate_reason(
|
|
|
2513
2514
|
own resolution path (#1474/#241's conflict-fix dispatch, reached
|
|
2514
2515
|
through the bounded retry below). A re-test does not rebase a branch,
|
|
2515
2516
|
and diverting to one is the same stall this issue is about, inverted.
|
|
2516
|
-
- a CI reason (#1891/#1892) — `merge_reason` already carries a
|
|
2517
|
-
recognised signal whose only resolution is more real time.
|
|
2518
|
-
bare waits sit right after the divergence check and must keep
|
|
2517
|
+
- a CI reason (#1891/#1892/#2252) — `merge_reason` already carries a
|
|
2518
|
+
live, recognised signal whose only resolution is more real time.
|
|
2519
|
+
These bare waits sit right after the divergence check and must keep
|
|
2520
|
+
winning.
|
|
2519
2521
|
|
|
2520
2522
|
The bool is the caller's warning label: a diagnostic-derived reason is a
|
|
2521
2523
|
SNAPSHOT of the last real attempt, refreshed by nothing but another
|
|
@@ -2528,8 +2530,10 @@ def _effective_merge_gate_reason(
|
|
|
2528
2530
|
return state.merge_reason, False
|
|
2529
2531
|
if state.merge_status == "" or state.merge_status.upper() == "CONFLICT":
|
|
2530
2532
|
return state.merge_reason, False
|
|
2531
|
-
if
|
|
2532
|
-
state.merge_reason
|
|
2533
|
+
if (
|
|
2534
|
+
is_ci_pending_reason(state.merge_reason)
|
|
2535
|
+
or is_ci_infra_reason(state.merge_reason)
|
|
2536
|
+
or is_ci_flaky_reason(state.merge_reason)
|
|
2533
2537
|
):
|
|
2534
2538
|
return state.merge_reason, False
|
|
2535
2539
|
fallback = _extract_gate_refusal_reason(counters.last_merge_diagnostic)
|
|
@@ -2851,6 +2855,27 @@ def _decide_merge(
|
|
|
2851
2855
|
)
|
|
2852
2856
|
)
|
|
2853
2857
|
|
|
2858
|
+
# #2252: the OTHER sibling case — a CI verdict DID arrive AND said
|
|
2859
|
+
# something real about the code, but `coord merge`'s own live attempt
|
|
2860
|
+
# has only observed it fail ONCE so far and is already re-running the
|
|
2861
|
+
# failed job(s) to rule out a flake (see
|
|
2862
|
+
# `coord.merge_queue.MAX_CI_FLAKY_RERUNS`) before spending a drive
|
|
2863
|
+
# attempt on it. Retrying `coord merge` here would just re-observe the
|
|
2864
|
+
# same in-flight re-run and spend an attempt for nothing — same bare
|
|
2865
|
+
# wait as #1891/#1892 above, for the identical reason: only more real
|
|
2866
|
+
# time (the re-run landing) resolves it, never another `coord merge`
|
|
2867
|
+
# retry. Once the re-run's answer is in, this reason either clears
|
|
2868
|
+
# (flake — merge proceeds, zero attempts spent) or reverts to the plain
|
|
2869
|
+
# "checks failed" wording (confirmed real — spends the attempt exactly
|
|
2870
|
+
# like today), so this wait is bounded by construction, never open-ended.
|
|
2871
|
+
if is_ci_flaky_reason(state.merge_reason):
|
|
2872
|
+
return _wait(
|
|
2873
|
+
label=(
|
|
2874
|
+
"MERGE: CI failed — re-running once to rule out a flake, "
|
|
2875
|
+
f"not retrying (#2252): {state.merge_reason}"
|
|
2876
|
+
)
|
|
2877
|
+
)
|
|
2878
|
+
|
|
2854
2879
|
status = state.merge_status
|
|
2855
2880
|
if status.upper() == "HUMAN_REQUIRED":
|
|
2856
2881
|
return _die(
|
|
@@ -72,7 +72,12 @@ from typing import Any, Iterable, Mapping, Sequence
|
|
|
72
72
|
|
|
73
73
|
from coord.drive_state import TERMINAL_STATUSES, WORK_LIKE
|
|
74
74
|
from coord.gate_a import is_gate_a_refusal_reason
|
|
75
|
-
from coord.merge_queue import
|
|
75
|
+
from coord.merge_queue import (
|
|
76
|
+
PLAN_READY,
|
|
77
|
+
is_ci_flaky_reason,
|
|
78
|
+
is_ci_infra_reason,
|
|
79
|
+
is_ci_pending_reason,
|
|
80
|
+
)
|
|
76
81
|
from coord.models import is_policy_refusal_reason
|
|
77
82
|
|
|
78
83
|
# ── queue states ─────────────────────────────────────────────────────────────
|
|
@@ -119,6 +124,17 @@ STATE_FAILED = "failed"
|
|
|
119
124
|
# relaunching a fresh `coord drive` right now would just observe the same
|
|
120
125
|
# rerun-in-progress and wait again, so this parks instead of spending an
|
|
121
126
|
# attempt. See `build_board_view`'s population of `merge_ci_pending` below.
|
|
127
|
+
#
|
|
128
|
+
# #2252 extends the SAME state to a THIRD trigger:
|
|
129
|
+
# `coord.merge_queue.is_ci_flaky_reason` — a CI verdict that DID arrive AND
|
|
130
|
+
# said something real about the code, but has only been observed failing
|
|
131
|
+
# ONCE so far. The "more real time" that un-parks the entry is the one
|
|
132
|
+
# scoped re-run (`MAX_CI_FLAKY_RERUNS`) landing — a coin-flip flake clears
|
|
133
|
+
# and the entry resumes having spent zero attempts, a confirmed-real failure
|
|
134
|
+
# reverts to a plain `checks_failed` block (spends the attempt exactly like
|
|
135
|
+
# today) on the very next tick. Same reasoning as #1892 for why this parks
|
|
136
|
+
# rather than spends: relaunching right now would just observe the same
|
|
137
|
+
# re-run-in-progress and wait again.
|
|
122
138
|
STATE_PARKED = "parked"
|
|
123
139
|
|
|
124
140
|
TERMINAL_QUEUE_STATES: frozenset[str] = frozenset(
|
|
@@ -816,17 +832,34 @@ def build_board_view(
|
|
|
816
832
|
if is_ci_infra_reason(raw_reason) and not is_ci_infra_reason(plan_reason):
|
|
817
833
|
reason = raw_reason
|
|
818
834
|
reason_is_live = False
|
|
819
|
-
|
|
835
|
+
# #2252: same recovery, for the sibling CI_FLAKY_PREFIX
|
|
836
|
+
# classification — a `checks_failed` streak currently mid its one
|
|
837
|
+
# #2252 re-run to rule out a flake. `_entry_gate_status` re-derives
|
|
838
|
+
# this identically to a plain "checks failed: ..." block (it has no
|
|
839
|
+
# notion of the raw row's `ci_flaky_reruns`/`ci_flaky_pending`
|
|
840
|
+
# state), so the raw reading must win here too or this entry would
|
|
841
|
+
# never park — it would instead sit `checks_failed` and burn a
|
|
842
|
+
# drive-queue launch attempt for the exact transient #2252 exists
|
|
843
|
+
# to catch. `elif`: the two classifications are mutually exclusive
|
|
844
|
+
# per entry (see the identical `elif` in `drive_state._merge_entry`).
|
|
845
|
+
elif is_ci_flaky_reason(raw_reason) and not is_ci_flaky_reason(plan_reason):
|
|
846
|
+
reason = raw_reason
|
|
847
|
+
reason_is_live = False
|
|
848
|
+
if not (
|
|
849
|
+
is_ci_pending_reason(reason)
|
|
850
|
+
or is_ci_infra_reason(reason)
|
|
851
|
+
or is_ci_flaky_reason(reason)
|
|
852
|
+
):
|
|
820
853
|
continue
|
|
821
854
|
# #2158: the same plan row that came back with NO reason of its own
|
|
822
855
|
# also carries `ci_summary` — `summarize_counts` over the very checks
|
|
823
856
|
# `_entry_gate_status` just consulted, on the same board build. When
|
|
824
857
|
# that rollup positively shows every check finished and none failed,
|
|
825
858
|
# it is direct evidence AGAINST the raw row's frozen "CI running:" /
|
|
826
|
-
# "CI infra:" string, which no read path ever
|
|
827
|
-
# write-path string over it is what wedged
|
|
828
|
-
# parked for 7h25m on CI that had gone green
|
|
829
|
-
# written.
|
|
859
|
+
# "CI infra:" / "CI re-checking:" string, which no read path ever
|
|
860
|
+
# rewrites. Believing the write-path string over it is what wedged
|
|
861
|
+
# claude-coordinator#2138 parked for 7h25m on CI that had gone green
|
|
862
|
+
# 41s before the park was written.
|
|
830
863
|
#
|
|
831
864
|
# The override is deliberately POSITIVE-evidence-only, and only where
|
|
832
865
|
# the plan itself is silent:
|
|
@@ -34,7 +34,7 @@ from dataclasses import asdict, dataclass, field
|
|
|
34
34
|
from pathlib import Path
|
|
35
35
|
from typing import Any
|
|
36
36
|
|
|
37
|
-
from coord.merge_queue import is_ci_infra_reason
|
|
37
|
+
from coord.merge_queue import is_ci_flaky_reason, is_ci_infra_reason
|
|
38
38
|
from coord.models import WORK_LIKE_TYPES, test_mode_from_labels
|
|
39
39
|
|
|
40
40
|
# Assignment types that can carry the Test/Review gates for an issue. Sourced
|
|
@@ -582,6 +582,21 @@ def _merge_entry(
|
|
|
582
582
|
raw_reason = raw_entry.get("error")
|
|
583
583
|
if is_ci_infra_reason(raw_reason) and not is_ci_infra_reason(reason):
|
|
584
584
|
reason = raw_reason
|
|
585
|
+
# #2252: same recovery, for the SAME reason, for the sibling
|
|
586
|
+
# CI_FLAKY_PREFIX classification — `_entry_gate_status`'s fresh
|
|
587
|
+
# re-derivation has no notion of "this entry already spent its one
|
|
588
|
+
# #2252 re-run and is waiting on the answer" (that state lives only
|
|
589
|
+
# in `QueuedMerge.ci_flaky_reruns`/`ci_flaky_pending`, updated by
|
|
590
|
+
# the live `merge_queue.process()` path and persisted onto the raw
|
|
591
|
+
# row's `error`), so it would otherwise re-derive the SAME failing
|
|
592
|
+
# checks as the plain "checks failed: ..." wording every tick,
|
|
593
|
+
# shadowing the more specific CI-re-checking reading the raw row
|
|
594
|
+
# already has. `elif` — the two classifications are mutually
|
|
595
|
+
# exclusive per entry (one failure streak is either infra or
|
|
596
|
+
# flaky-pending, never both at once), so only one raw-preference
|
|
597
|
+
# branch can ever legitimately fire for a given raw_reason.
|
|
598
|
+
elif is_ci_flaky_reason(raw_reason) and not is_ci_flaky_reason(reason):
|
|
599
|
+
reason = raw_reason
|
|
585
600
|
|
|
586
601
|
return {
|
|
587
602
|
"status": status,
|
|
@@ -1630,6 +1630,32 @@ def rerun_workflow_run(repo: str, run_id: str) -> bool:
|
|
|
1630
1630
|
return result.returncode == 0
|
|
1631
1631
|
|
|
1632
1632
|
|
|
1633
|
+
def rerun_workflow_run_failed(repo: str, run_id: str) -> bool:
|
|
1634
|
+
"""Re-run only the FAILING job(s) of Actions workflow run *run_id* on
|
|
1635
|
+
*repo* via ``gh run rerun <id> --failed`` (#2252).
|
|
1636
|
+
|
|
1637
|
+
The single ``gh`` sink for :meth:`coord.ci_github.GitHubCi.
|
|
1638
|
+
rerun_failed_for_pr` — the narrower sibling of
|
|
1639
|
+
:func:`rerun_workflow_run` (#1851/#1892), which restarts the WHOLE run
|
|
1640
|
+
including jobs that already reported green. ``--failed`` is exactly
|
|
1641
|
+
#2252's own scoping ask: cheaper, and it keeps the first pass's green
|
|
1642
|
+
evidence intact instead of discarding it for no reason.
|
|
1643
|
+
|
|
1644
|
+
Returns ``True`` only on a clean (exit 0) rerun; any subprocess failure
|
|
1645
|
+
(missing ``gh``, timeout, non-zero exit — e.g. the run is already in
|
|
1646
|
+
progress, or the id is stale/invalid) returns ``False`` rather than
|
|
1647
|
+
raising, matching :func:`rerun_workflow_run`'s own best-effort contract.
|
|
1648
|
+
"""
|
|
1649
|
+
try:
|
|
1650
|
+
result = subprocess.run(
|
|
1651
|
+
["gh", "run", "rerun", str(run_id), "--repo", repo, "--failed"],
|
|
1652
|
+
capture_output=True, text=True, timeout=30,
|
|
1653
|
+
)
|
|
1654
|
+
except (OSError, subprocess.TimeoutExpired):
|
|
1655
|
+
return False
|
|
1656
|
+
return result.returncode == 0
|
|
1657
|
+
|
|
1658
|
+
|
|
1633
1659
|
def truncate_diff_text(diff: str, max_chars: int = 60000) -> str:
|
|
1634
1660
|
"""Truncate *diff* to *max_chars* with a trailing note, if it's over.
|
|
1635
1661
|
|
|
@@ -801,6 +801,52 @@ def _record_gate_bypass_audit(entry: "QueuedMerge", config) -> list[str]:
|
|
|
801
801
|
return bypassed
|
|
802
802
|
|
|
803
803
|
|
|
804
|
+
def _record_ci_flake_audit(entry: "QueuedMerge", pending_json: str) -> None:
|
|
805
|
+
"""Emit one ``ci_flake_detected`` operational audit row (#2252): a check
|
|
806
|
+
that failed once, was re-run exactly once, and came back clean.
|
|
807
|
+
|
|
808
|
+
*pending_json* is the JSON blob :func:`process` stashed on
|
|
809
|
+
``entry.ci_flaky_pending`` at the moment it triggered the re-run — the
|
|
810
|
+
failing check names/conclusions and the branch SHA they failed against,
|
|
811
|
+
captured then because ``branch_head_sha`` is transient (recomputed every
|
|
812
|
+
tick, never persisted) and the checks themselves may already read
|
|
813
|
+
differently on ``gh`` by the time the re-run resolves.
|
|
814
|
+
|
|
815
|
+
This audit row is the thing #2252 asks for explicitly: without a durable
|
|
816
|
+
record, a check that is flaky 30% of the time gets silently waved
|
|
817
|
+
through every time instead of surfacing as a repeat offender someone
|
|
818
|
+
should fix — ``record_audit`` (queryable via ``coord audit`` /
|
|
819
|
+
``query_audit_log``) is that durable record. Best-effort like every
|
|
820
|
+
other audit call site in this module: ``record_audit`` never raises,
|
|
821
|
+
and a malformed/missing blob (should not happen — this module is the
|
|
822
|
+
only writer of ``ci_flaky_pending``) degrades to an empty ``checks``
|
|
823
|
+
list rather than raising into the merge loop.
|
|
824
|
+
"""
|
|
825
|
+
try:
|
|
826
|
+
payload = json.loads(pending_json) if pending_json else {}
|
|
827
|
+
except (TypeError, ValueError):
|
|
828
|
+
payload = {}
|
|
829
|
+
record_audit(
|
|
830
|
+
tier="operational",
|
|
831
|
+
category="ci",
|
|
832
|
+
event_type="ci_flake_detected",
|
|
833
|
+
actor="system",
|
|
834
|
+
summary=(
|
|
835
|
+
f"CI flake on {entry.repo_name}#{entry.issue_number} "
|
|
836
|
+
f"(PR #{entry.pr_number}): failed once, passed on re-run — "
|
|
837
|
+
"zero drive attempts spent (#2252)"
|
|
838
|
+
),
|
|
839
|
+
repo=entry.repo_name,
|
|
840
|
+
issue=entry.issue_number,
|
|
841
|
+
assignment_id=entry.assignment_id,
|
|
842
|
+
details={
|
|
843
|
+
"pr_number": entry.pr_number,
|
|
844
|
+
"sha": payload.get("sha"),
|
|
845
|
+
"checks": payload.get("checks", []),
|
|
846
|
+
},
|
|
847
|
+
)
|
|
848
|
+
|
|
849
|
+
|
|
804
850
|
@dataclass(frozen=True)
|
|
805
851
|
class MergeGateFailure:
|
|
806
852
|
"""One un-satisfied merge gate for a work row / queue entry (#1695).
|
|
@@ -1408,6 +1454,32 @@ def is_ci_infra_reason(reason: str | None) -> bool:
|
|
|
1408
1454
|
return (reason or "").startswith(CI_INFRA_PREFIX)
|
|
1409
1455
|
|
|
1410
1456
|
|
|
1457
|
+
# #2252: the reason string prefix for a `checks_failed` entry whose failing
|
|
1458
|
+
# check(s) carry a REAL verdict about the code — unlike `CI_INFRA_PREFIX`
|
|
1459
|
+
# above — but have only been observed failing ONCE so far. `process()` has
|
|
1460
|
+
# triggered exactly one scoped re-run of the failed job(s) (#2252's whole
|
|
1461
|
+
# ask: "before a failed check consumes a drive attempt, re-run the failed
|
|
1462
|
+
# job(s) once and re-read" — a 1-in-N flaky test reports the identical
|
|
1463
|
+
# completed/failure verdict a genuine regression does, so the verdict alone
|
|
1464
|
+
# can't tell them apart; a second, independent observation can) and is
|
|
1465
|
+
# waiting on its answer.
|
|
1466
|
+
#
|
|
1467
|
+
# Distinctly named from the plain "checks failed: ..." wording a CONFIRMED
|
|
1468
|
+
# failure produces (this entry's one-shot re-run budget already spent,
|
|
1469
|
+
# still red on the second read) so `coord.drive`'s retry accounting and
|
|
1470
|
+
# `coord.drive_queue`'s `parked` state can extend the SAME "self-refreshing,
|
|
1471
|
+
# no attempt yet" treatment #1891/#1892 already give
|
|
1472
|
+
# `CI_PENDING_PREFIX`/`CI_INFRA_PREFIX` to this one — see
|
|
1473
|
+
# :func:`is_ci_flaky_reason` and `MAX_CI_FLAKY_RERUNS`.
|
|
1474
|
+
CI_FLAKY_PREFIX = "CI re-checking:"
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
def is_ci_flaky_reason(reason: str | None) -> bool:
|
|
1478
|
+
"""True when *reason* names a `checks_failed` block currently mid its
|
|
1479
|
+
ONE #2252 re-run to rule out a flake — see :data:`CI_FLAKY_PREFIX`."""
|
|
1480
|
+
return (reason or "").startswith(CI_FLAKY_PREFIX)
|
|
1481
|
+
|
|
1482
|
+
|
|
1411
1483
|
# #1892: auto-reruns `process()` will trigger for a single entry's verdictless
|
|
1412
1484
|
# CI failure (via `CiStore.rerun_for_pr`) before giving up and parking it for
|
|
1413
1485
|
# a human instead of the queue's own #1891 machinery. A workflow genuinely
|
|
@@ -1430,6 +1502,15 @@ MAX_CI_INFRA_RERUNS = 2
|
|
|
1430
1502
|
# without masking a PR that just isn't going to catch up unattended.
|
|
1431
1503
|
MAX_CI_STALE_RERUNS = 2
|
|
1432
1504
|
|
|
1505
|
+
# #2252: at most one auto-rerun per failure streak before a genuinely-
|
|
1506
|
+
# verdicted (non-infra) `checks_failed` spends the drive attempt exactly as
|
|
1507
|
+
# it does today. "One re-run, not a retry loop" is the issue's own bound:
|
|
1508
|
+
# two independent observations (the original run and this one re-run) is
|
|
1509
|
+
# enough to tell "broken" from "flaky" without starting to mask code that is
|
|
1510
|
+
# genuinely, repeatedly broken — a higher cap here would blur back into the
|
|
1511
|
+
# thing #1892's own cap already guards against for the verdictless case.
|
|
1512
|
+
MAX_CI_FLAKY_RERUNS = 1
|
|
1513
|
+
|
|
1433
1514
|
|
|
1434
1515
|
def _ci_infra_reason(
|
|
1435
1516
|
ci: "CiStore", repo: str, number: int, failed: "list[CheckRun]"
|
|
@@ -2251,6 +2332,26 @@ class QueuedMerge:
|
|
|
2251
2332
|
# Capped at `MAX_CI_STALE_RERUNS`. 0 for every entry that has never gone
|
|
2252
2333
|
# CI-stale, and for rows predating this column.
|
|
2253
2334
|
ci_stale_reruns: int = 0
|
|
2335
|
+
# #2252: count of automatic `CiStore.rerun_failed_for_pr` calls
|
|
2336
|
+
# `process()` has issued for this entry's CURRENT streak of genuinely-
|
|
2337
|
+
# verdicted (non-infra) CI failures — capped at `MAX_CI_FLAKY_RERUNS`.
|
|
2338
|
+
# Kept separate from `ci_infra_reruns`/`ci_stale_reruns` above for the
|
|
2339
|
+
# same reason those two are kept apart from each other: independently
|
|
2340
|
+
# capped, independently legible in the audit trail. 0 for every entry
|
|
2341
|
+
# that has never hit a genuine-verdict failure, and for rows predating
|
|
2342
|
+
# this column.
|
|
2343
|
+
ci_flaky_reruns: int = 0
|
|
2344
|
+
# #2252: JSON blob of the failing check names/conclusions and the
|
|
2345
|
+
# branch SHA they failed against, captured at the moment `process()`
|
|
2346
|
+
# triggered this entry's one flake-checking re-run. `branch_head_sha`
|
|
2347
|
+
# itself is transient (recomputed from GitHub every tick, never
|
|
2348
|
+
# persisted) — this is the only durable record of WHAT failed once the
|
|
2349
|
+
# re-run's answer arrives on a later tick. `""` (falsy) means no re-run
|
|
2350
|
+
# is currently pending an answer; set only while `ci_flaky_reruns`
|
|
2351
|
+
# reflects an in-flight re-run, cleared the moment its answer (pass ->
|
|
2352
|
+
# flake recorded via `record_audit`, fail -> confirmed real, no flake)
|
|
2353
|
+
# is known.
|
|
2354
|
+
ci_flaky_pending: str = ""
|
|
2254
2355
|
|
|
2255
2356
|
|
|
2256
2357
|
class GhOps(Protocol):
|
|
@@ -2568,6 +2669,10 @@ def load_queue() -> list[QueuedMerge]:
|
|
|
2568
2669
|
# #2197: same NULL-to-0 decoding as ci_infra_reruns above, for
|
|
2569
2670
|
# rows predating this column.
|
|
2570
2671
|
ci_stale_reruns=row["ci_stale_reruns"] or 0,
|
|
2672
|
+
# #2252: same NULL-to-0/'' decoding as the other rerun counters
|
|
2673
|
+
# above, for rows predating these columns.
|
|
2674
|
+
ci_flaky_reruns=row["ci_flaky_reruns"] or 0,
|
|
2675
|
+
ci_flaky_pending=row["ci_flaky_pending"] or "",
|
|
2571
2676
|
)
|
|
2572
2677
|
for row in rows
|
|
2573
2678
|
]
|
|
@@ -2585,8 +2690,8 @@ def save_queue(items: list[QueuedMerge]) -> None:
|
|
|
2585
2690
|
target_branch, issue_number, issue_title, state,
|
|
2586
2691
|
pr_number, pr_url, size, last_attempt, error, enqueued_at,
|
|
2587
2692
|
assignment_type, required_gates, ci_infra_reruns,
|
|
2588
|
-
ci_stale_reruns
|
|
2589
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
|
2693
|
+
ci_stale_reruns, ci_flaky_reruns, ci_flaky_pending
|
|
2694
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
|
2590
2695
|
(
|
|
2591
2696
|
item.assignment_id, item.repo_name, item.repo_github,
|
|
2592
2697
|
item.branch, item.target_branch, item.issue_number,
|
|
@@ -2594,6 +2699,7 @@ def save_queue(items: list[QueuedMerge]) -> None:
|
|
|
2594
2699
|
item.size, item.last_attempt, item.error, item.enqueued_at,
|
|
2595
2700
|
item.assignment_type, json.dumps(list(item.required_gates or [])),
|
|
2596
2701
|
item.ci_infra_reruns, item.ci_stale_reruns,
|
|
2702
|
+
item.ci_flaky_reruns, item.ci_flaky_pending,
|
|
2597
2703
|
),
|
|
2598
2704
|
)
|
|
2599
2705
|
|
|
@@ -5110,6 +5216,69 @@ def process(
|
|
|
5110
5216
|
entry.error = msg
|
|
5111
5217
|
events.append(MergeEvent(entry, "checks_failed", msg))
|
|
5112
5218
|
continue # #292: skip, don't halt the group
|
|
5219
|
+
# #2252: reached only when `infra_reason is None` —
|
|
5220
|
+
# every failing check carries a REAL verdict about the
|
|
5221
|
+
# code (#1892's verdictless case is handled/exhausted
|
|
5222
|
+
# above). A real verdict is still not enough to tell
|
|
5223
|
+
# "broken" from "flaky": a 1-in-N random-tempdir
|
|
5224
|
+
# collision reports exactly the same completed/failure
|
|
5225
|
+
# conclusion a genuine regression does. Re-run the
|
|
5226
|
+
# failed job(s) once — scoped via `rerun_failed_for_pr`
|
|
5227
|
+
# so the green evidence from checks that already passed
|
|
5228
|
+
# is never touched — and re-read before spending the
|
|
5229
|
+
# drive attempt this failure would otherwise cost.
|
|
5230
|
+
if entry.ci_flaky_reruns < MAX_CI_FLAKY_RERUNS:
|
|
5231
|
+
rerun_failed_for_pr = getattr(
|
|
5232
|
+
ci, "rerun_failed_for_pr", None
|
|
5233
|
+
)
|
|
5234
|
+
reran = (
|
|
5235
|
+
rerun_failed_for_pr(entry.repo_github, entry.pr_number)
|
|
5236
|
+
if rerun_failed_for_pr is not None
|
|
5237
|
+
else False
|
|
5238
|
+
)
|
|
5239
|
+
if reran:
|
|
5240
|
+
entry.ci_flaky_reruns += 1
|
|
5241
|
+
entry.ci_flaky_pending = json.dumps({
|
|
5242
|
+
"checks": [
|
|
5243
|
+
{"name": c.name, "conclusion": c.conclusion}
|
|
5244
|
+
for c in failed
|
|
5245
|
+
],
|
|
5246
|
+
"sha": entry.branch_head_sha,
|
|
5247
|
+
})
|
|
5248
|
+
msg = (
|
|
5249
|
+
f"{CI_FLAKY_PREFIX} {summary} — re-running "
|
|
5250
|
+
"once before treating as broken "
|
|
5251
|
+
f"({entry.ci_flaky_reruns}/"
|
|
5252
|
+
f"{MAX_CI_FLAKY_RERUNS}, #2252)"
|
|
5253
|
+
)
|
|
5254
|
+
entry.error = msg
|
|
5255
|
+
_log.info(
|
|
5256
|
+
"#2252 flake re-check %d/%d for %s#%d "
|
|
5257
|
+
"(PR #%s): %s (rerun_failed_for_pr triggered)",
|
|
5258
|
+
entry.ci_flaky_reruns, MAX_CI_FLAKY_RERUNS,
|
|
5259
|
+
entry.repo_name, entry.issue_number,
|
|
5260
|
+
entry.pr_number, summary,
|
|
5261
|
+
)
|
|
5262
|
+
events.append(MergeEvent(entry, "ci_flaky_rerun", msg))
|
|
5263
|
+
continue # #292: skip, don't halt the group
|
|
5264
|
+
# #2252 fail-safe: the re-run could not be
|
|
5265
|
+
# triggered (no `rerun_failed_for_pr` capability, or
|
|
5266
|
+
# the `gh` call itself failed) — fall straight
|
|
5267
|
+
# through to the plain `checks_failed` block below,
|
|
5268
|
+
# spending the attempt exactly as if this feature
|
|
5269
|
+
# did not exist. Never treat "could not re-run" as
|
|
5270
|
+
# "passed", and never increment `ci_flaky_reruns`
|
|
5271
|
+
# for a re-run that never actually happened.
|
|
5272
|
+
elif entry.ci_flaky_pending:
|
|
5273
|
+
# Budget already spent for this failure streak and
|
|
5274
|
+
# it is STILL red on the second read — confirmed
|
|
5275
|
+
# real, not a flake (#2252's other acceptance
|
|
5276
|
+
# criterion: "a check that fails twice: attempt
|
|
5277
|
+
# consumed, entry blocks — identical to today").
|
|
5278
|
+
# Nothing to record; clear the pending marker so a
|
|
5279
|
+
# later, unrelated resolution doesn't misattribute
|
|
5280
|
+
# this already-confirmed streak as a flake.
|
|
5281
|
+
entry.ci_flaky_pending = ""
|
|
5113
5282
|
msg = f"checks failed: {summary}"
|
|
5114
5283
|
entry.error = msg
|
|
5115
5284
|
events.append(MergeEvent(entry, "checks_failed", msg))
|
|
@@ -5150,6 +5319,19 @@ def process(
|
|
|
5150
5319
|
# that case is harmless since such an entry can never have
|
|
5151
5320
|
# accrued a nonzero `ci_infra_reruns` to begin with.
|
|
5152
5321
|
entry.ci_infra_reruns = 0
|
|
5322
|
+
# #2252: this same "genuinely resolved" point is also where
|
|
5323
|
+
# a suspected-flaky failure gets its answer: nothing failed
|
|
5324
|
+
# and nothing is pending, so the one re-run this entry spent
|
|
5325
|
+
# (see the `ci_flaky_reruns`/`CI_FLAKY_PREFIX` branch above)
|
|
5326
|
+
# came back clean. Record it — the audit trail is what keeps
|
|
5327
|
+
# this from quietly becoming a "just retry until green"
|
|
5328
|
+
# button: a check that is flaky 30% of the time should show
|
|
5329
|
+
# up as thirty recorded flakes, not thirty invisible free
|
|
5330
|
+
# passes.
|
|
5331
|
+
if entry.ci_flaky_pending:
|
|
5332
|
+
_record_ci_flake_audit(entry, entry.ci_flaky_pending)
|
|
5333
|
+
entry.ci_flaky_pending = ""
|
|
5334
|
+
entry.ci_flaky_reruns = 0
|
|
5153
5335
|
# #1851: a green CI result can itself be stale relative to the
|
|
5154
5336
|
# base — see `_ci_checks_are_stale`'s docstring. Named
|
|
5155
5337
|
# distinctly (`checks_stale`) from checks_failed/
|