code-coordinator 0.5.172__tar.gz → 0.5.175__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.172 → code_coordinator-0.5.175}/PKG-INFO +1 -1
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/ci_github.py +50 -17
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/ci_store.py +27 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/merge.py +55 -1
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/drive.py +120 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/gate_snapshot.py +40 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/merge_queue.py +48 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/OPERATING_GOTCHAS.md +17 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/manifest.yml +155 -0
- code_coordinator-0.5.175/tests/acceptance/ms-65/tabs_persistence_2286.rs +1105 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_board_read_path.py +81 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_ci_store.py +69 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_merge.py +93 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_drive.py +72 -1
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_merge_queue.py +78 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/tests/acceptance.rs +1 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.github/workflows/acceptance-web.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/.gitignore +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/CLAUDE.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/GOAL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/LICENSE +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/MANIFEST.in +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/README.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/__init__.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/agent.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/audit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/block_log.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/board_service.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/brain.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/claim.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/cli.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/client.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/comments.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/config.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dao.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/db.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/deps.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/events.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/filelock.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/freshness.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/gates.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/goal.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/context.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/models.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/render.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/health/units.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/hooks.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/interactive.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/models.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/network.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/notify.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/openapi.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/parentage.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/plans.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/progress.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/release_window.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/reports.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/review.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/self_health.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/smoke.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/split_work.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/state.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/test_author.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/test_report.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/usage.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/install-agent.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/pyproject.toml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/setup.cfg +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/__init__.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/conftest.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_config.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_db.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_events.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_init.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_models.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_network.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_review.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_session.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_split.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_state.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.172 → code_coordinator-0.5.175}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -810,6 +810,7 @@ tests/acceptance/ms-65/detail_substate_2285.rs
|
|
|
810
810
|
tests/acceptance/ms-65/manifest.yml
|
|
811
811
|
tests/acceptance/ms-65/pipeline_tabs_2284.rs
|
|
812
812
|
tests/acceptance/ms-65/tabs_discoverability_2287.rs
|
|
813
|
+
tests/acceptance/ms-65/tabs_persistence_2286.rs
|
|
813
814
|
tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen
|
|
814
815
|
tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen
|
|
815
816
|
tests/acceptance/ms-65/mocks/board-preview-tab.screen
|
{code_coordinator-0.5.172 → code_coordinator-0.5.175}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -456,6 +456,7 @@
|
|
|
456
456
|
"tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen",
|
|
457
457
|
"tests/acceptance/ms-65/pipeline_tabs_2284.rs",
|
|
458
458
|
"tests/acceptance/ms-65/tabs_discoverability_2287.rs",
|
|
459
|
+
"tests/acceptance/ms-65/tabs_persistence_2286.rs",
|
|
459
460
|
"tests/acceptance/ms-example/mocks/home-active.html",
|
|
460
461
|
"tests/conftest.py",
|
|
461
462
|
"tests/fixtures/board-pipeline-basic.json",
|
|
@@ -146,6 +146,49 @@ class GitHubCi:
|
|
|
146
146
|
return True
|
|
147
147
|
|
|
148
148
|
def list_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
|
|
149
|
+
"""Checks the merge gate evaluates — narrowed to what GitHub's own
|
|
150
|
+
branch protection actually REQUIRES, when that's determinable
|
|
151
|
+
(#2388/#2446).
|
|
152
|
+
|
|
153
|
+
A repo can report far more `gh pr checks` entries than GitHub's
|
|
154
|
+
required-status-check list (this repo: 9 reported, 5 required), and
|
|
155
|
+
every merge-gate predicate downstream of this method
|
|
156
|
+
(`failed_checks`, `in_flight_checks`, `checks_are_stale`) otherwise
|
|
157
|
+
waits on advisory jobs GitHub itself doesn't — a hung/flaky ADVISORY
|
|
158
|
+
check (e.g. `Acceptance (web)`, or an unconditional Playwright/
|
|
159
|
+
Chromium install with no timeout) then blocks `coord merge`
|
|
160
|
+
indefinitely even though the PR is already `MERGEABLE`. Never
|
|
161
|
+
filters (returns everything :meth:`list_all_checks_for_pr` does)
|
|
162
|
+
when the required list can't be determined — #1525's bias: unknown
|
|
163
|
+
reads as "wait on everything reported", not as a free pass to stop
|
|
164
|
+
waiting on something that might matter.
|
|
165
|
+
|
|
166
|
+
#2446: this is deliberately the ONLY narrowed view — see
|
|
167
|
+
:meth:`list_all_checks_for_pr` for the full, unfiltered set that
|
|
168
|
+
feeds `coord merge --plan`'s CI summary, so a regressed advisory
|
|
169
|
+
check stays visible to an operator even though it can no longer gate
|
|
170
|
+
a merge attempt.
|
|
171
|
+
"""
|
|
172
|
+
checks = self._all_checks(repo, number)
|
|
173
|
+
required = self._required_contexts(repo)
|
|
174
|
+
if required:
|
|
175
|
+
return [c for c in checks if c.name in required]
|
|
176
|
+
return checks
|
|
177
|
+
|
|
178
|
+
def list_all_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
|
|
179
|
+
"""Every check `gh pr checks` reports, required or advisory (#2446).
|
|
180
|
+
|
|
181
|
+
Purely a visibility view — `coord merge --plan`/the TUI's CI badges
|
|
182
|
+
read this so a regressed ADVISORY check (one GitHub's branch
|
|
183
|
+
protection doesn't require, and :meth:`list_checks_for_pr` therefore
|
|
184
|
+
no longer waits on) is still something an operator can see, per
|
|
185
|
+
#2446's suggested fix: "still visible ... but should never gate a
|
|
186
|
+
merge attempt." Shares :meth:`list_checks_for_pr`'s cached fetch —
|
|
187
|
+
one `gh pr checks` subprocess call backs both views, never two.
|
|
188
|
+
"""
|
|
189
|
+
return self._all_checks(repo, number)
|
|
190
|
+
|
|
191
|
+
def _all_checks(self, repo: str, number: int) -> list[CheckRun]:
|
|
149
192
|
key = (repo, number)
|
|
150
193
|
now = time.time()
|
|
151
194
|
cached = self._cache.get(key)
|
|
@@ -367,7 +410,13 @@ class GitHubCi:
|
|
|
367
410
|
return [_unreadable_check(repo, number, str(e))]
|
|
368
411
|
if not isinstance(raw, list):
|
|
369
412
|
return [_unreadable_check(repo, number, "gh pr checks returned non-list JSON")]
|
|
370
|
-
|
|
413
|
+
# #2446: `_all_checks` (this method's only caller) is the single
|
|
414
|
+
# unfiltered fetch shared by both `list_checks_for_pr` (narrowed to
|
|
415
|
+
# required contexts) and `list_all_checks_for_pr` (everything) — the
|
|
416
|
+
# required-contexts narrowing used to happen here, which meant an
|
|
417
|
+
# advisory check's regression was invisible everywhere, not just to
|
|
418
|
+
# the merge gate. See both methods' docstrings.
|
|
419
|
+
return [
|
|
371
420
|
CheckRun(
|
|
372
421
|
name=str(entry.get("name", "")),
|
|
373
422
|
status=_status_from_bucket(str(entry.get("bucket", ""))),
|
|
@@ -380,22 +429,6 @@ class GitHubCi:
|
|
|
380
429
|
for entry in raw
|
|
381
430
|
if isinstance(entry, dict)
|
|
382
431
|
]
|
|
383
|
-
# #2388: narrow to what branch protection actually REQUIRES, when
|
|
384
|
-
# that's determinable — a repo can report far more `gh pr checks`
|
|
385
|
-
# entries than GitHub's own required list (this repo: 9 reported, 5
|
|
386
|
-
# required), and every merge-gate predicate downstream of this
|
|
387
|
-
# method (`failed_checks`, `in_flight_checks`, `checks_are_stale`)
|
|
388
|
-
# otherwise waits on advisory jobs GitHub itself doesn't. A hung
|
|
389
|
-
# advisory job (e.g. an unconditional Playwright/Chromium install
|
|
390
|
-
# with no timeout) would then block `coord merge` indefinitely even
|
|
391
|
-
# though the PR is already `MERGEABLE`. `_required_contexts` returns
|
|
392
|
-
# `None` (never filters) when it can't determine the required list
|
|
393
|
-
# — #1525's bias: unknown reads as "wait on everything reported",
|
|
394
|
-
# not as a free pass to stop waiting on something that might matter.
|
|
395
|
-
required = self._required_contexts(repo)
|
|
396
|
-
if required:
|
|
397
|
-
checks = [c for c in checks if c.name in required]
|
|
398
|
-
return checks
|
|
399
432
|
|
|
400
433
|
def _required_contexts(self, repo: str) -> frozenset[str] | None:
|
|
401
434
|
now = time.time()
|
|
@@ -125,6 +125,28 @@ class CiStore(Protocol):
|
|
|
125
125
|
|
|
126
126
|
def list_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]: ...
|
|
127
127
|
|
|
128
|
+
def list_all_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
|
|
129
|
+
"""Every check reported for *repo*/*number*, required or advisory
|
|
130
|
+
(#2446) — the unfiltered counterpart to :meth:`list_checks_for_pr`,
|
|
131
|
+
which narrows to what branch protection actually requires so the
|
|
132
|
+
merge gate never blocks on a merely-advisory check (see that
|
|
133
|
+
method's docstring on :class:`coord.ci_github.GitHubCi`).
|
|
134
|
+
|
|
135
|
+
Purely a visibility view: `coord merge --plan`'s CI summary reads
|
|
136
|
+
this so a regressed advisory check is still visible to an operator
|
|
137
|
+
even though it can no longer gate a merge attempt — matching what
|
|
138
|
+
GitHub's own merge button already allows.
|
|
139
|
+
|
|
140
|
+
Optional/duck-typed like :meth:`rerun_failed_for_pr` — call sites
|
|
141
|
+
use ``getattr(ci_store, "list_all_checks_for_pr", None)`` and fall
|
|
142
|
+
back to :meth:`list_checks_for_pr` for a stand-in (a test stub, or
|
|
143
|
+
:class:`coord.gate_snapshot.GateSnapshot` when its own snapshot
|
|
144
|
+
wasn't refreshed with the unfiltered view) that predates this
|
|
145
|
+
capability — read as "no separate advisory view available", not an
|
|
146
|
+
error.
|
|
147
|
+
"""
|
|
148
|
+
...
|
|
149
|
+
|
|
128
150
|
@property
|
|
129
151
|
def is_available(self) -> bool: ...
|
|
130
152
|
|
|
@@ -232,6 +254,11 @@ class NoOpCi:
|
|
|
232
254
|
def list_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
|
|
233
255
|
return []
|
|
234
256
|
|
|
257
|
+
def list_all_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
|
|
258
|
+
"""No-op: CI gating is disabled entirely, so there is nothing to
|
|
259
|
+
show either the gate or an operator (#2446)."""
|
|
260
|
+
return []
|
|
261
|
+
|
|
235
262
|
@property
|
|
236
263
|
def is_available(self) -> bool:
|
|
237
264
|
return False
|
|
@@ -944,6 +944,60 @@ def _reconcile_via_daemon(svc, params: dict) -> None:
|
|
|
944
944
|
sys.exit(int(code))
|
|
945
945
|
|
|
946
946
|
|
|
947
|
+
def _ci_field(summary, name: str, default=0):
|
|
948
|
+
"""Read *name* off a CI rollup, tolerating both shapes ``p.ci_summary``/
|
|
949
|
+
``p.ci_summary_all`` can arrive in (#2446).
|
|
950
|
+
|
|
951
|
+
``coord.merge_queue.plan()`` (the local, in-process path) hands back
|
|
952
|
+
real :class:`~coord.ci_store.CiCheckSummary` instances. ``coord merge
|
|
953
|
+
--plan`` against a daemon instead reconstructs ``PlannedMerge`` from the
|
|
954
|
+
``/board`` JSON payload (``_show_plan_from_daemon`` below) — the server
|
|
955
|
+
side flattens each rollup with ``dataclasses.asdict`` and nothing
|
|
956
|
+
re-hydrates it, so on that path both fields arrive as plain ``dict``s
|
|
957
|
+
instead. ``summary`` is ``None`` on either path when there's nothing to
|
|
958
|
+
report (no PR yet, no ``ci_store``, …).
|
|
959
|
+
"""
|
|
960
|
+
if summary is None:
|
|
961
|
+
return default
|
|
962
|
+
if isinstance(summary, dict):
|
|
963
|
+
return summary.get(name, default)
|
|
964
|
+
return getattr(summary, name, default)
|
|
965
|
+
|
|
966
|
+
|
|
967
|
+
def _advisory_ci_note(p) -> str:
|
|
968
|
+
"""#2446: describe any check failing/still-running in the unfiltered
|
|
969
|
+
(required + advisory) CI rollup that the required-only rollup
|
|
970
|
+
(``p.ci_summary`` — the same view the merge gate itself evaluates)
|
|
971
|
+
doesn't already account for.
|
|
972
|
+
|
|
973
|
+
A regression here is on a check GitHub's own branch protection doesn't
|
|
974
|
+
require — `coord merge`'s gate correctly no longer blocks on it (see
|
|
975
|
+
``coord.ci_github.GitHubCi.list_checks_for_pr``'s docstring), but an
|
|
976
|
+
operator staring at a READY row while a real job is red/hung nearby
|
|
977
|
+
still deserves to see it. Returns ``""`` when there's nothing extra to
|
|
978
|
+
report (no ``ci_summary_all``, or it agrees with ``ci_summary``).
|
|
979
|
+
"""
|
|
980
|
+
if p.ci_summary_all is None:
|
|
981
|
+
return ""
|
|
982
|
+
req_failed = _ci_field(p.ci_summary, "failed")
|
|
983
|
+
req_running = _ci_field(p.ci_summary, "running")
|
|
984
|
+
req_failed_names = set(_ci_field(p.ci_summary, "failed_names", []) or [])
|
|
985
|
+
extra_failed = _ci_field(p.ci_summary_all, "failed") - req_failed
|
|
986
|
+
extra_running = _ci_field(p.ci_summary_all, "running") - req_running
|
|
987
|
+
if extra_failed <= 0 and extra_running <= 0:
|
|
988
|
+
return ""
|
|
989
|
+
all_failed_names = _ci_field(p.ci_summary_all, "failed_names", []) or []
|
|
990
|
+
advisory_failed_names = [n for n in all_failed_names if n not in req_failed_names]
|
|
991
|
+
bits = []
|
|
992
|
+
if advisory_failed_names:
|
|
993
|
+
bits.append("failing: " + ", ".join(advisory_failed_names))
|
|
994
|
+
elif extra_failed > 0:
|
|
995
|
+
bits.append(f"{extra_failed} failing")
|
|
996
|
+
if extra_running > 0:
|
|
997
|
+
bits.append(f"{extra_running} running")
|
|
998
|
+
return " [advisory CI, not blocking — " + "; ".join(bits) + "]"
|
|
999
|
+
|
|
1000
|
+
|
|
947
1001
|
def _print_merge_plan_entries(planned: list) -> None:
|
|
948
1002
|
"""Print a list of PlannedMerge entries grouped by repo → target_branch."""
|
|
949
1003
|
if not planned:
|
|
@@ -963,7 +1017,7 @@ def _print_merge_plan_entries(planned: list) -> None:
|
|
|
963
1017
|
_status_str = f"{_p.status} {_p.reason}"
|
|
964
1018
|
click.echo(
|
|
965
1019
|
f" {_p.rank}. #{_p.issue_number} {_size_str} "
|
|
966
|
-
f"{_status_str} {_p.issue_title}"
|
|
1020
|
+
f"{_status_str} {_p.issue_title}{_advisory_ci_note(_p)}"
|
|
967
1021
|
)
|
|
968
1022
|
|
|
969
1023
|
|
|
@@ -114,6 +114,7 @@ from coord.failure_class import (
|
|
|
114
114
|
plan_usage_limit_resume,
|
|
115
115
|
)
|
|
116
116
|
from coord.models import DELIVERABLE_ANALYSIS_LABEL, POLICY_REFUSAL_MARKER
|
|
117
|
+
from coord.self_health import self_freshness
|
|
117
118
|
from coord.usage_limits import PlanLimits, evaluate_usage_gate, get_plan_limits
|
|
118
119
|
# Lost in the #1584-onto-#1590 rebase: _decide_review() calls this, but the
|
|
119
120
|
# import lived in a hunk #1590 rewrote, so the merge came out textually clean
|
|
@@ -181,6 +182,20 @@ EXIT_DISPATCH_REFUSED = 5
|
|
|
181
182
|
# vimcode#635 for the two live incidents (140 minutes and ~25 minutes of a
|
|
182
183
|
# held queue slot, respectively, producing nothing).
|
|
183
184
|
EXIT_DEAD_END = 6
|
|
185
|
+
# #2443: a deliberate SELF-HEAL exit, not a failure — the drive loop noticed
|
|
186
|
+
# it was stuck repeating the identical WAIT reason (see `_SELF_HEAL_WAIT_
|
|
187
|
+
# STREAK`) while its OWN on-disk `coord` install had moved since this
|
|
188
|
+
# session started. Python never reloads an already-imported module, so a
|
|
189
|
+
# fix landing mid-run is otherwise invisible to a live session for as long
|
|
190
|
+
# as `--deadline` allows — the claude-coordinator#2286 incident this closes
|
|
191
|
+
# polled one unfetchable path every ~60s for 2+ hours after the fix was
|
|
192
|
+
# already on disk. Distinct from EXIT_DISPATCH_REFUSED/EXIT_DEAD_END on
|
|
193
|
+
# purpose: this condition is NOT permanent — relaunching is exactly the fix
|
|
194
|
+
# — so it must fall through `coord.drive_queue._reconcile_running`'s
|
|
195
|
+
# ordinary `retry` branch rather than either of those two `blocked`
|
|
196
|
+
# branches, which is why nothing in drive_queue.py needs to special-case
|
|
197
|
+
# this code at all.
|
|
198
|
+
EXIT_SELF_STALE = 7
|
|
184
199
|
|
|
185
200
|
|
|
186
201
|
class DriveError(Exception):
|
|
@@ -218,6 +233,31 @@ _CAPTURED_OUTPUT_LIMIT = 4000
|
|
|
218
233
|
# never *tightened* for the environmental case.
|
|
219
234
|
_ENVIRONMENTAL_WORK_RETRY_BUDGET = 5
|
|
220
235
|
|
|
236
|
+
# #2443: how many CONSECUTIVE polls of the IDENTICAL `Action.label` to
|
|
237
|
+
# tolerate before `Driver._loop` checks whether its own on-disk `coord`
|
|
238
|
+
# install has moved since this session started. Below this, a same-label
|
|
239
|
+
# repeat is indistinguishable from an ordinary slow-but-progressing wait (a
|
|
240
|
+
# 10-20 minute test, a slow CI check) and checking would just be wasted
|
|
241
|
+
# subprocess calls; at/above it, the check itself is a single local `git
|
|
242
|
+
# rev-parse HEAD` (no network — see `coord.self_health.self_freshness
|
|
243
|
+
# (fetch=False)`), cheap enough to run on every remaining poll of the
|
|
244
|
+
# streak. At the default `--poll` of 60s this is ~10 minutes — fast enough
|
|
245
|
+
# to matter against a multi-hour `--deadline`, slow enough that a routine
|
|
246
|
+
# wait is never mistaken for the stuck case this exists to catch.
|
|
247
|
+
_SELF_HEAL_WAIT_STREAK = 10
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _current_self_head() -> str | None:
|
|
251
|
+
"""Real default for `Driver.self_head_probe` (#2443): THIS process's own
|
|
252
|
+
on-disk `coord` install's current HEAD, or ``None`` when it can't be
|
|
253
|
+
determined (not a git checkout, unreadable HEAD — see
|
|
254
|
+
:func:`coord.self_health.self_freshness`). ``fetch=False``: this only
|
|
255
|
+
needs to notice code that has ALREADY landed locally (e.g. a prior `git
|
|
256
|
+
pull`), never reaches the network, and therefore never blocks the poll
|
|
257
|
+
loop on a slow/unreachable origin.
|
|
258
|
+
"""
|
|
259
|
+
return self_freshness(fetch=False).head_sha
|
|
260
|
+
|
|
221
261
|
|
|
222
262
|
def _bounded_tail(text: str, limit: int = _CAPTURED_OUTPUT_LIMIT) -> str:
|
|
223
263
|
"""*text*, or its last *limit* characters if longer — the tail, because
|
|
@@ -3685,8 +3725,19 @@ class Driver:
|
|
|
3685
3725
|
# real `claude -p "/usage"` subprocess — mirrors *verifier*/*oracle_gate*
|
|
3686
3726
|
# above. Defaults to the real (cached, ~60s) probe.
|
|
3687
3727
|
usage_prober: Callable[[], PlanLimits] = get_plan_limits
|
|
3728
|
+
# #2443: injected so tests can script a fake on-disk HEAD sequence
|
|
3729
|
+
# without a real git checkout — same shape as *usage_prober* above.
|
|
3730
|
+
# Defaults to the real, local-only (`fetch=False`) probe.
|
|
3731
|
+
self_head_probe: Callable[[], str | None] = _current_self_head
|
|
3688
3732
|
|
|
3689
3733
|
_run_log: Path | None = field(default=None, init=False, repr=False)
|
|
3734
|
+
# #2443: this session's own on-disk `coord` HEAD, captured once by
|
|
3735
|
+
# `_loop()` right as the poll loop begins — the baseline every later
|
|
3736
|
+
# `_self_heal_drift_message` check compares against. `None` when it
|
|
3737
|
+
# could not be determined (not a git checkout, unreadable HEAD), which
|
|
3738
|
+
# keeps the self-heal check permanently a no-op for this run rather than
|
|
3739
|
+
# ever comparing against a placeholder.
|
|
3740
|
+
_start_head_sha: str | None = field(default=None, init=False, repr=False)
|
|
3690
3741
|
# #1499: the terminating Action's own message, captured by `_loop()` right
|
|
3691
3742
|
# before it returns — `run()` folds this into the `drive_exited` audit
|
|
3692
3743
|
# summary/details so a non-exceptional terminal exit (e.g. `decide()`
|
|
@@ -3818,6 +3869,36 @@ class Driver:
|
|
|
3818
3869
|
finally:
|
|
3819
3870
|
lock.release()
|
|
3820
3871
|
|
|
3872
|
+
# ── self-heal (#2443) ──────────────────────────────────────────────
|
|
3873
|
+
def _self_heal_drift_message(self, label: str, streak: int) -> str | None:
|
|
3874
|
+
"""Has THIS process's own on-disk ``coord`` install moved since this
|
|
3875
|
+
drive session started? ``None`` when it hasn't — or when freshness
|
|
3876
|
+
can't be determined at all, which must never be misread as drift —
|
|
3877
|
+
the overwhelmingly common case, so the caller just keeps waiting
|
|
3878
|
+
exactly as before.
|
|
3879
|
+
|
|
3880
|
+
Only ever consulted once *label* (a WAIT ``Action``'s own reason)
|
|
3881
|
+
has repeated *streak* times in a row (``_loop``'s
|
|
3882
|
+
``_SELF_HEAL_WAIT_STREAK`` gate) — this is specifically the #2286
|
|
3883
|
+
shape: ``_decide_acceptance_author``'s "could not verify commits
|
|
3884
|
+
(git fetch failed), retrying" arm returned the IDENTICAL label every
|
|
3885
|
+
~60s for 2+ hours after the fix that would have resolved it had
|
|
3886
|
+
already landed on disk, because Python never reloads an
|
|
3887
|
+
already-imported module. A stale in-memory `coord/drive.py` has no
|
|
3888
|
+
way to notice that on its own — this is the bounded check that lets
|
|
3889
|
+
it notice anyway.
|
|
3890
|
+
"""
|
|
3891
|
+
current = self.self_head_probe()
|
|
3892
|
+
if not current or not self._start_head_sha or current == self._start_head_sha:
|
|
3893
|
+
return None
|
|
3894
|
+
return (
|
|
3895
|
+
"code changed underneath this session — on-disk coord moved "
|
|
3896
|
+
f"from {self._start_head_sha[:8]} to {current[:8]} while stuck "
|
|
3897
|
+
f"repeating the same wait {streak}x: {label!r}. Exiting "
|
|
3898
|
+
"(EXIT_SELF_STALE) so coord drive-queue relaunches with "
|
|
3899
|
+
f"current code instead of continuing to wait on stale logic (#2443)."
|
|
3900
|
+
)
|
|
3901
|
+
|
|
3821
3902
|
def _post_escalation_comment(self, state: IssueState, message: str) -> None:
|
|
3822
3903
|
"""#1526: durably surface an escalation's reason onto the issue
|
|
3823
3904
|
itself, not just this run's tmux pane and the ``coord escalate``
|
|
@@ -4061,6 +4142,15 @@ class Driver:
|
|
|
4061
4142
|
# nudge) while guaranteeing a stalled stage is never more than one
|
|
4062
4143
|
# `stall_secs` window away from a fresh check.
|
|
4063
4144
|
last_nudge: float | None = None
|
|
4145
|
+
# #2443: this session's own on-disk `coord` HEAD, captured once,
|
|
4146
|
+
# right as the poll loop begins — see `_self_heal_drift_message`.
|
|
4147
|
+
self._start_head_sha = self.self_head_probe()
|
|
4148
|
+
# A distinct object (never equal to any real `Action.label`, empty
|
|
4149
|
+
# string included) so the very first WAIT of the run always starts
|
|
4150
|
+
# its streak at 1 rather than accidentally matching an unset
|
|
4151
|
+
# sentinel.
|
|
4152
|
+
last_wait_label: object = object()
|
|
4153
|
+
same_wait_streak = 0
|
|
4064
4154
|
|
|
4065
4155
|
while True:
|
|
4066
4156
|
now = self.clock()
|
|
@@ -4155,6 +4245,36 @@ class Driver:
|
|
|
4155
4245
|
for warning in action.warnings:
|
|
4156
4246
|
self.warn(warning)
|
|
4157
4247
|
|
|
4248
|
+
# #2443: self-heal — see `_self_heal_drift_message`. Tracked off
|
|
4249
|
+
# the Action's own `label`, NOT `fingerprint` above: a WAIT can
|
|
4250
|
+
# (and, in the #2286 shape, does) repeat the identical reason
|
|
4251
|
+
# poll after poll while the board fingerprint itself is static
|
|
4252
|
+
# for the same underlying reason, so this is really the same
|
|
4253
|
+
# signal — but keying directly on what the loop is ABOUT TO DO
|
|
4254
|
+
# keeps this correct even for a WAIT arm whose label happens to
|
|
4255
|
+
# be static text unrelated to fingerprint (e.g. "TEST: in
|
|
4256
|
+
# progress on a capability-matched machine") without needing to
|
|
4257
|
+
# reason about the two staying in lockstep. A non-WAIT action
|
|
4258
|
+
# (RUN or EXIT) always resets the streak: dispatching something
|
|
4259
|
+
# is progress by definition.
|
|
4260
|
+
if action.kind == WAIT:
|
|
4261
|
+
if action.label == last_wait_label:
|
|
4262
|
+
same_wait_streak += 1
|
|
4263
|
+
else:
|
|
4264
|
+
last_wait_label = action.label
|
|
4265
|
+
same_wait_streak = 1
|
|
4266
|
+
if same_wait_streak >= _SELF_HEAL_WAIT_STREAK:
|
|
4267
|
+
drift = self._self_heal_drift_message(
|
|
4268
|
+
action.label, same_wait_streak
|
|
4269
|
+
)
|
|
4270
|
+
if drift:
|
|
4271
|
+
self._last_exit_message = drift
|
|
4272
|
+
self.warn(drift)
|
|
4273
|
+
return EXIT_SELF_STALE
|
|
4274
|
+
else:
|
|
4275
|
+
last_wait_label = object()
|
|
4276
|
+
same_wait_streak = 0
|
|
4277
|
+
|
|
4158
4278
|
if action.is_exit:
|
|
4159
4279
|
# #1499: capture the exit reason for the audit boundary before
|
|
4160
4280
|
# anything below can fail — the escalation write is explicitly
|
|
@@ -136,6 +136,16 @@ class GateSnapshot:
|
|
|
136
136
|
"""
|
|
137
137
|
|
|
138
138
|
checks: dict[tuple[str, int], list[CheckRun]] = field(default_factory=dict)
|
|
139
|
+
# #2446: the unfiltered counterpart to `checks` above — `checks` is
|
|
140
|
+
# already narrowed to branch-protection-required contexts (see
|
|
141
|
+
# `coord.ci_github.GitHubCi.list_checks_for_pr`'s docstring), so a
|
|
142
|
+
# regressed ADVISORY check (one GitHub's own merge button doesn't wait
|
|
143
|
+
# on either) would otherwise be invisible to `coord merge --plan`'s CI
|
|
144
|
+
# summary, not just to the merge gate. Populated from
|
|
145
|
+
# `list_all_checks_for_pr` when the inner `CiStore` offers it; falls
|
|
146
|
+
# back to the same (already-narrowed) data as `checks` for a backend
|
|
147
|
+
# that doesn't, same fail-open shape as `workflows_declared` below.
|
|
148
|
+
all_checks: dict[tuple[str, int], list[CheckRun]] = field(default_factory=dict)
|
|
139
149
|
commit_messages: dict[tuple[str, int], list[str]] = field(default_factory=dict)
|
|
140
150
|
epic_issues: dict[tuple[str, int], bool] = field(default_factory=dict)
|
|
141
151
|
# #1640: (repo, branch) -> HEAD SHA, and (repo, base, head) -> patch-id,
|
|
@@ -180,6 +190,19 @@ class GateSnapshot:
|
|
|
180
190
|
return [_stale_check(age)]
|
|
181
191
|
return self.checks.get((repo, number), [])
|
|
182
192
|
|
|
193
|
+
def list_all_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
|
|
194
|
+
"""Unfiltered counterpart to :meth:`list_checks_for_pr` (#2446) —
|
|
195
|
+
same staleness handling, but keyed off ``all_checks`` so an
|
|
196
|
+
advisory check's regression stays visible to `coord merge --plan`
|
|
197
|
+
even though `list_checks_for_pr` (the gate's own view) no longer
|
|
198
|
+
waits on it.
|
|
199
|
+
"""
|
|
200
|
+
if self.ci_available:
|
|
201
|
+
age = None if self.refreshed_at is None else time.time() - self.refreshed_at
|
|
202
|
+
if age is None or age > STALE_AFTER_SECONDS:
|
|
203
|
+
return [_stale_check(age)]
|
|
204
|
+
return self.all_checks.get((repo, number), [])
|
|
205
|
+
|
|
183
206
|
def expects_checks(self, repo: str, number: int) -> bool:
|
|
184
207
|
# #1904: unlike `list_checks_for_pr`'s "unknown reads as failing"
|
|
185
208
|
# (#1525) posture, a repo this snapshot hasn't cached an answer for
|
|
@@ -286,6 +309,7 @@ class GateSnapshotRefresher:
|
|
|
286
309
|
entries = [e for e in pending if e.pr_number]
|
|
287
310
|
|
|
288
311
|
checks: dict[tuple[str, int], list[CheckRun]] = {}
|
|
312
|
+
all_checks: dict[tuple[str, int], list[CheckRun]] = {}
|
|
289
313
|
messages: dict[tuple[str, int], list[str]] = {}
|
|
290
314
|
epics: dict[tuple[str, int], bool] = {}
|
|
291
315
|
branch_shas: dict[tuple[str, str], str | None] = {}
|
|
@@ -342,6 +366,21 @@ class GateSnapshotRefresher:
|
|
|
342
366
|
checks[key] = inner.list_checks_for_pr(*key)
|
|
343
367
|
except Exception: # noqa: BLE001 — fail-open for this entry
|
|
344
368
|
checks[key] = []
|
|
369
|
+
# #2446: the unfiltered view backing `coord merge --plan`'s
|
|
370
|
+
# CI summary — see `GateSnapshot.all_checks`'s field
|
|
371
|
+
# comment. `list_all_checks_for_pr` is optional/duck-typed
|
|
372
|
+
# (a `CiStore` stand-in that predates #2446 doesn't offer
|
|
373
|
+
# it); falling back to the already-fetched `checks[key]`
|
|
374
|
+
# degrades to "advisory checks aren't shown separately",
|
|
375
|
+
# never to an extra `gh` call or a missing key.
|
|
376
|
+
list_all = getattr(inner, "list_all_checks_for_pr", None)
|
|
377
|
+
if list_all is not None:
|
|
378
|
+
try:
|
|
379
|
+
all_checks[key] = list_all(*key)
|
|
380
|
+
except Exception: # noqa: BLE001 — fail-open for this entry
|
|
381
|
+
all_checks[key] = checks[key]
|
|
382
|
+
else:
|
|
383
|
+
all_checks[key] = checks[key]
|
|
345
384
|
# #1904: repo-wide, so dedupe across every pending entry in
|
|
346
385
|
# the same repo — one `gh api .../actions/workflows` call
|
|
347
386
|
# per repo per tick, not one per PR. A failure here reads
|
|
@@ -372,6 +411,7 @@ class GateSnapshotRefresher:
|
|
|
372
411
|
|
|
373
412
|
snap = GateSnapshot(
|
|
374
413
|
checks=checks,
|
|
414
|
+
all_checks=all_checks,
|
|
375
415
|
commit_messages=messages,
|
|
376
416
|
epic_issues=epics,
|
|
377
417
|
branch_shas=branch_shas,
|
|
@@ -3984,6 +3984,20 @@ class PlannedMerge:
|
|
|
3984
3984
|
# when no PR is open yet, or `ci_store` has no checks for this PR.
|
|
3985
3985
|
pr_number: int | None = None
|
|
3986
3986
|
ci_summary: "CiCheckSummary | None" = None
|
|
3987
|
+
# #2446: the unfiltered (required + advisory) counterpart to
|
|
3988
|
+
# `ci_summary` above, which is narrowed to what GitHub's branch
|
|
3989
|
+
# protection actually requires — the same scope the merge gate itself
|
|
3990
|
+
# evaluates (see `_entry_gate_status`/`coord.ci_github.GitHubCi.
|
|
3991
|
+
# list_checks_for_pr`'s docstrings). A merely-advisory check regressing
|
|
3992
|
+
# (a flaky/hung job the branch's own protection rules don't wait on
|
|
3993
|
+
# either) must never gate a merge attempt, but it's still worth an
|
|
3994
|
+
# operator seeing — this is what `coord merge --plan` renders that from.
|
|
3995
|
+
# `None` under the same conditions as `ci_summary` (no PR yet, or no
|
|
3996
|
+
# `ci_store`); a `CiStore` that predates `list_all_checks_for_pr` yields
|
|
3997
|
+
# the same value as `ci_summary` rather than `None`, so a plan built
|
|
3998
|
+
# against an older store still shows *something* instead of silently
|
|
3999
|
+
# losing the badge.
|
|
4000
|
+
ci_summary_all: "CiCheckSummary | None" = None
|
|
3987
4001
|
# #2397: mirrors `config.merge.auto_drain` (default False) at plan-build
|
|
3988
4002
|
# time — read-only exposure, no gate-logic change. The TUI's per-issue
|
|
3989
4003
|
# Merge stage box needs this to tell "nothing retries until a human runs
|
|
@@ -4101,6 +4115,7 @@ def plan(
|
|
|
4101
4115
|
reason: str | None = None
|
|
4102
4116
|
|
|
4103
4117
|
ci_summary = None
|
|
4118
|
+
ci_summary_all = None
|
|
4104
4119
|
if entry.state == PENDING:
|
|
4105
4120
|
base_status, reason = _entry_gate_status(
|
|
4106
4121
|
entry, board, config, ci_store, gh_ops
|
|
@@ -4126,11 +4141,43 @@ def plan(
|
|
|
4126
4141
|
# only ever populates checks for entries that are PENDING at
|
|
4127
4142
|
# refresh time, so a MERGING/MERGED row never had real
|
|
4128
4143
|
# snapshot data to render in the first place.
|
|
4144
|
+
#
|
|
4145
|
+
# #2446: `ci_summary` MUST stay derived from the same
|
|
4146
|
+
# (already required-narrowed) `list_checks_for_pr` view
|
|
4147
|
+
# `_entry_gate_status` just consulted above — do not widen it
|
|
4148
|
+
# to the unfiltered check list. `coord.drive_queue
|
|
4149
|
+
# ._ci_rollup_all_clear` reads this exact field as positive
|
|
4150
|
+
# evidence that a frozen "CI running:" raw-row string has
|
|
4151
|
+
# gone stale, and that evidence is only valid when it is
|
|
4152
|
+
# counting the SAME checks the live gate decision is based
|
|
4153
|
+
# on (see that function's docstring); widening it here would
|
|
4154
|
+
# make a still-pending ADVISORY check block the #2158
|
|
4155
|
+
# park-recovery self-heal even though the gate itself (and
|
|
4156
|
+
# GitHub's own merge button) is already clear. Advisory
|
|
4157
|
+
# visibility is a genuinely separate concern — see
|
|
4158
|
+
# `ci_summary_all` below.
|
|
4129
4159
|
if ci_store is not None and ci_store.is_available and entry.pr_number:
|
|
4130
4160
|
checks = ci_store.list_checks_for_pr(entry.repo_github, entry.pr_number)
|
|
4131
4161
|
if checks:
|
|
4132
4162
|
ci_summary = summarize_counts(checks)
|
|
4133
4163
|
|
|
4164
|
+
# #2446: the unfiltered (required + advisory) rollup —
|
|
4165
|
+
# pure visibility, never consulted by any gate decision
|
|
4166
|
+
# or self-heal evidence. Lets `coord merge --plan`/the
|
|
4167
|
+
# TUI still show a regressed advisory check (e.g.
|
|
4168
|
+
# `Acceptance (web)`) even though it can no longer block
|
|
4169
|
+
# `_entry_gate_status` above or the #2158 recovery read
|
|
4170
|
+
# above. Falls back to `ci_summary` for a `CiStore`
|
|
4171
|
+
# stand-in that predates `list_all_checks_for_pr`.
|
|
4172
|
+
list_all = getattr(ci_store, "list_all_checks_for_pr", None)
|
|
4173
|
+
all_checks = (
|
|
4174
|
+
list_all(entry.repo_github, entry.pr_number)
|
|
4175
|
+
if list_all is not None
|
|
4176
|
+
else checks
|
|
4177
|
+
)
|
|
4178
|
+
if all_checks:
|
|
4179
|
+
ci_summary_all = summarize_counts(all_checks)
|
|
4180
|
+
|
|
4134
4181
|
result.append(PlannedMerge(
|
|
4135
4182
|
assignment_id=entry.assignment_id,
|
|
4136
4183
|
repo_name=entry.repo_name,
|
|
@@ -4145,6 +4192,7 @@ def plan(
|
|
|
4145
4192
|
reason=reason,
|
|
4146
4193
|
pr_number=entry.pr_number,
|
|
4147
4194
|
ci_summary=ci_summary,
|
|
4195
|
+
ci_summary_all=ci_summary_all,
|
|
4148
4196
|
enqueued_at=entry.enqueued_at,
|
|
4149
4197
|
last_attempt=entry.last_attempt,
|
|
4150
4198
|
milestone=milestones.get((entry.repo_name, entry.issue_number)),
|
|
@@ -44,6 +44,23 @@ doc's guess) and reports STALE with a commit count when it hasn't been pulled
|
|
|
44
44
|
since a `coord/**` fix merged — the checkable gate for this row, the same way
|
|
45
45
|
`coord diagnose --graph` is the checkable gate for graphify freshness.
|
|
46
46
|
|
|
47
|
+
**#2443: a LIVE `coord drive` session now self-heals mid-run too.** #2436
|
|
48
|
+
above only helps *before* a new launch — it says nothing about a session
|
|
49
|
+
that was already running, with the OLD code loaded into memory, when the fix
|
|
50
|
+
landed. Python never reloads an already-imported module, so a stale live
|
|
51
|
+
session has no way to notice a fix on its own. `coord/drive.py`'s poll loop
|
|
52
|
+
now watches its own `WAIT` actions: once the identical wait reason repeats
|
|
53
|
+
`_SELF_HEAL_WAIT_STREAK` (10) polls in a row, it compares its own on-disk
|
|
54
|
+
`coord` HEAD (captured once, at session start) against the current one
|
|
55
|
+
(`coord.self_health.self_freshness(fetch=False)` — a local `git rev-parse
|
|
56
|
+
HEAD`, no network). If the checkout moved underneath it, the session exits
|
|
57
|
+
`EXIT_SELF_STALE` — a clean, non-permanent exit `coord drive-queue`'s
|
|
58
|
+
ordinary retry/relaunch path picks straight back up under the current code —
|
|
59
|
+
instead of continuing to poll dead logic for the rest of `--deadline`. This
|
|
60
|
+
is the actual fix for the incident #2436 diagnosed after the fact: a live
|
|
61
|
+
session on dellserver polled one unfetchable path every ~60s for 2+ hours
|
|
62
|
+
after the #2319/#2320 fix that would have resolved it was already on disk.
|
|
63
|
+
|
|
47
64
|
Not academic. #1394 (worker strands uncommitted work, then cleanup destroys it)
|
|
48
65
|
sat merged-but-undeployed, and the very next dispatch — #1402 — hit the
|
|
49
66
|
identical bug: **$3.44 and 10 minutes lost to something already fixed on
|