code-coordinator 0.5.139__tar.gz → 0.5.141__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.139 → code_coordinator-0.5.141}/PKG-INFO +1 -1
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/SOURCES.txt +3 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/scm_file_list.json +3 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agent.py +42 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agent_app.py +70 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/drive_queue.py +12 -5
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/release.py +161 -26
- code_coordinator-0.5.141/coord/reconcile_tick.py +65 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/AGENT_OPERATIONS.md +42 -0
- code_coordinator-0.5.141/tests/test_agent_drive_queue_reconcile_2373.py +157 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_drive_queue.py +35 -0
- code_coordinator-0.5.141/tests/test_reconcile_tick.py +82 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_cordon_2101.py +160 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.gitignore +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/CLAUDE.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/GOAL.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/LICENSE +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/MANIFEST.in +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/README.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/__init__.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/audit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/block_log.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/board_service.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/brain.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/claim.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/cli.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/client.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/comments.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/config.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dao.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/db.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deps.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/drive.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/events.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/filelock.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/freshness.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/gates.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/goal.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/context.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/models.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/render.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/units.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/hooks.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/interactive.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/models.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/network.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notify.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/openapi.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/parentage.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/plans.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/progress.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/release_window.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/reports.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/review.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/smoke.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/split_work.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/state.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/test_author.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/test_report.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/usage.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/install-agent.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/pyproject.toml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/setup.cfg +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/__init__.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/conftest.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_db.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_events.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_init.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_models.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_network.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_session.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_split.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_state.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -112,6 +112,7 @@ coord/prereqs.py
|
|
|
112
112
|
coord/progress.py
|
|
113
113
|
coord/queue_diagnose.py
|
|
114
114
|
coord/reconcile.py
|
|
115
|
+
coord/reconcile_tick.py
|
|
115
116
|
coord/refine_chat.py
|
|
116
117
|
coord/release_cordon.py
|
|
117
118
|
coord/release_propagate.py
|
|
@@ -431,6 +432,7 @@ tests/test_agent_branch_capture.py
|
|
|
431
432
|
tests/test_agent_config_free_1712.py
|
|
432
433
|
tests/test_agent_deploy_units_endpoint.py
|
|
433
434
|
tests/test_agent_dirty_worktree.py
|
|
435
|
+
tests/test_agent_drive_queue_reconcile_2373.py
|
|
434
436
|
tests/test_agent_graph_self_heal.py
|
|
435
437
|
tests/test_agent_health_h3.py
|
|
436
438
|
tests/test_agent_idle_restart.py
|
|
@@ -682,6 +684,7 @@ tests/test_reconcile_branch.py
|
|
|
682
684
|
tests/test_reconcile_completions.py
|
|
683
685
|
tests/test_reconcile_merges.py
|
|
684
686
|
tests/test_reconcile_no_agent_record.py
|
|
687
|
+
tests/test_reconcile_tick.py
|
|
685
688
|
tests/test_reconcile_usage_limit_done.py
|
|
686
689
|
tests/test_refine_chat.py
|
|
687
690
|
tests/test_release_cordon_2101.py
|
{code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -293,6 +293,7 @@
|
|
|
293
293
|
"coord/providers/opencode.py",
|
|
294
294
|
"coord/queue_diagnose.py",
|
|
295
295
|
"coord/reconcile.py",
|
|
296
|
+
"coord/reconcile_tick.py",
|
|
296
297
|
"coord/refine_chat.py",
|
|
297
298
|
"coord/release_cordon.py",
|
|
298
299
|
"coord/release_propagate.py",
|
|
@@ -474,6 +475,7 @@
|
|
|
474
475
|
"tests/test_agent_config_free_1712.py",
|
|
475
476
|
"tests/test_agent_deploy_units_endpoint.py",
|
|
476
477
|
"tests/test_agent_dirty_worktree.py",
|
|
478
|
+
"tests/test_agent_drive_queue_reconcile_2373.py",
|
|
477
479
|
"tests/test_agent_graph_self_heal.py",
|
|
478
480
|
"tests/test_agent_health_h3.py",
|
|
479
481
|
"tests/test_agent_idle_restart.py",
|
|
@@ -725,6 +727,7 @@
|
|
|
725
727
|
"tests/test_reconcile_completions.py",
|
|
726
728
|
"tests/test_reconcile_merges.py",
|
|
727
729
|
"tests/test_reconcile_no_agent_record.py",
|
|
730
|
+
"tests/test_reconcile_tick.py",
|
|
728
731
|
"tests/test_reconcile_usage_limit_done.py",
|
|
729
732
|
"tests/test_refine_chat.py",
|
|
730
733
|
"tests/test_release_cordon_2101.py",
|
|
@@ -6102,6 +6102,48 @@ class AgentServer:
|
|
|
6102
6102
|
self._local_health_cache = None
|
|
6103
6103
|
return {**result.to_dict(), "repo": repo_name}
|
|
6104
6104
|
|
|
6105
|
+
def reconcile_drive_queue(self, *, timeout: float = 120.0) -> dict:
|
|
6106
|
+
"""``coord drive-queue tick --reconcile-only`` — run on THIS machine
|
|
6107
|
+
(#2373 — ``coord release propagate``'s drain-deadline escalation
|
|
6108
|
+
fans this out to a host it has cordoned but that will not drain, via
|
|
6109
|
+
`_reconcile_launch_host` in `coord/commands/release.py`).
|
|
6110
|
+
|
|
6111
|
+
Only the machine that launched a `running` drive-queue entry can
|
|
6112
|
+
resolve it (the #1870 cross-host guard in
|
|
6113
|
+
`coord.drive_queue._reconcile_running` is keyed on a LOCAL tmux
|
|
6114
|
+
read); this method is that resolution, reachable over this agent's
|
|
6115
|
+
HTTP API instead of a human's SSH session. Full incident writeup
|
|
6116
|
+
(claude-coordinator#2360) and rationale: `_reconcile_launch_host`'s
|
|
6117
|
+
docstring and docs/AGENT_OPERATIONS.md's #2373 section.
|
|
6118
|
+
|
|
6119
|
+
Delegates to :func:`coord.reconcile_tick.run_reconcile_tick` — the
|
|
6120
|
+
same shared implementation `coord release propagate`'s own
|
|
6121
|
+
`_run_reconcile_tick` (`coord/commands/release.py`) calls, so there
|
|
6122
|
+
is exactly one implementation of "what a reconcile-only tick does",
|
|
6123
|
+
not two that can drift apart.
|
|
6124
|
+
|
|
6125
|
+
Returns ``{"ok": bool, "detail": str}``. ``ok=False`` with a
|
|
6126
|
+
``no local coordinator.yml`` detail when this agent has no on-disk
|
|
6127
|
+
config to pass as ``--config`` — thin-client/config-free mode
|
|
6128
|
+
(docs/EPHEMERAL_WORKERS.md) has nothing for a queue tick to resolve
|
|
6129
|
+
against here. Never raises: the caller (`/drive-queue-reconcile`) is
|
|
6130
|
+
a best-effort self-heal step inside a larger escalation, not a gate
|
|
6131
|
+
that may take propagation down with it.
|
|
6132
|
+
"""
|
|
6133
|
+
from coord.reconcile_tick import run_reconcile_tick # noqa: PLC0415
|
|
6134
|
+
|
|
6135
|
+
config_path = getattr(self._health_config, "path", None)
|
|
6136
|
+
if not config_path:
|
|
6137
|
+
return {
|
|
6138
|
+
"ok": False,
|
|
6139
|
+
"detail": (
|
|
6140
|
+
"no local coordinator.yml on this agent — cannot resolve "
|
|
6141
|
+
"a --config path for the tick"
|
|
6142
|
+
),
|
|
6143
|
+
}
|
|
6144
|
+
ok, detail = run_reconcile_tick(config_path, timeout=timeout, detail_limit=2000)
|
|
6145
|
+
return {"ok": ok, "detail": detail}
|
|
6146
|
+
|
|
6105
6147
|
def list_repos(self) -> dict[str, dict]:
|
|
6106
6148
|
"""Return local HEAD / branch / dirty flag for each configured repo.
|
|
6107
6149
|
|
|
@@ -1020,6 +1020,42 @@ def _openapi_spec() -> dict:
|
|
|
1020
1020
|
},
|
|
1021
1021
|
}
|
|
1022
1022
|
},
|
|
1023
|
+
"/drive-queue-reconcile": {
|
|
1024
|
+
"post": {
|
|
1025
|
+
"summary": (
|
|
1026
|
+
"Run `coord drive-queue tick --reconcile-only` on this "
|
|
1027
|
+
"machine (#2373)"
|
|
1028
|
+
),
|
|
1029
|
+
"description": (
|
|
1030
|
+
"The per-machine self-heal `coord release propagate`'s "
|
|
1031
|
+
"drain-deadline escalation calls before it escalates "
|
|
1032
|
+
"loudly: only the host that actually launched a "
|
|
1033
|
+
"`running` drive-queue entry can resolve the #1870 "
|
|
1034
|
+
"cross-host liveness guard for it. Fleet-queue-wide, "
|
|
1035
|
+
"not scoped to a repo."
|
|
1036
|
+
),
|
|
1037
|
+
"requestBody": {
|
|
1038
|
+
"required": False,
|
|
1039
|
+
"content": {
|
|
1040
|
+
"application/json": {
|
|
1041
|
+
"schema": {
|
|
1042
|
+
"type": "object",
|
|
1043
|
+
"properties": {
|
|
1044
|
+
"timeout": {
|
|
1045
|
+
"type": "number",
|
|
1046
|
+
"description": (
|
|
1047
|
+
"seconds for the tick subprocess; "
|
|
1048
|
+
"defaults to 120."
|
|
1049
|
+
),
|
|
1050
|
+
},
|
|
1051
|
+
},
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
},
|
|
1055
|
+
},
|
|
1056
|
+
"responses": {"200": {"description": "OK (including a failed tick)"}},
|
|
1057
|
+
}
|
|
1058
|
+
},
|
|
1023
1059
|
"/artifact/{repo}/{branch}": {
|
|
1024
1060
|
"get": {
|
|
1025
1061
|
"summary": "Manifest of stashed build artifacts for a (repo, branch) pair",
|
|
@@ -1948,6 +1984,36 @@ def build_app(
|
|
|
1948
1984
|
result = await asyncio.to_thread(server.fix_graph, repo, timeout=timeout)
|
|
1949
1985
|
return JSONResponse(result)
|
|
1950
1986
|
|
|
1987
|
+
async def drive_queue_reconcile(request: Request) -> JSONResponse:
|
|
1988
|
+
"""Run ``coord drive-queue tick --reconcile-only`` on THIS machine
|
|
1989
|
+
(#2373). ``coord release propagate``'s drain-deadline escalation
|
|
1990
|
+
POSTs here — before it escalates loudly — on whichever host it has
|
|
1991
|
+
cordoned but that will not drain, so the one machine that can
|
|
1992
|
+
actually resolve the #1870 cross-host liveness ambiguity for an
|
|
1993
|
+
entry it launched gets asked to, automatically, instead of a human
|
|
1994
|
+
needing to SSH in and run this by hand (the live 2026-08-18 incident
|
|
1995
|
+
this closes).
|
|
1996
|
+
|
|
1997
|
+
Body: optional ``{"timeout": 120}``. No required fields, unlike
|
|
1998
|
+
``/graph-fix`` — a reconcile-only tick is fleet-queue-wide, not
|
|
1999
|
+
scoped to one repo.
|
|
2000
|
+
|
|
2001
|
+
Runs off the event loop: the subprocess holds the drive-queue file
|
|
2002
|
+
lock for the length of one tick, which must never stall this
|
|
2003
|
+
agent's ``/health`` for the rest of the fleet.
|
|
2004
|
+
"""
|
|
2005
|
+
body: dict = {}
|
|
2006
|
+
try:
|
|
2007
|
+
body = await request.json()
|
|
2008
|
+
except Exception:
|
|
2009
|
+
pass
|
|
2010
|
+
try:
|
|
2011
|
+
timeout = float(body.get("timeout", 120.0))
|
|
2012
|
+
except (TypeError, ValueError):
|
|
2013
|
+
timeout = 120.0
|
|
2014
|
+
result = await asyncio.to_thread(server.reconcile_drive_queue, timeout=timeout)
|
|
2015
|
+
return JSONResponse(result)
|
|
2016
|
+
|
|
1951
2017
|
routes = [
|
|
1952
2018
|
Route("/health", health, methods=["GET"]),
|
|
1953
2019
|
Route("/status", status, methods=["GET"]),
|
|
@@ -1973,6 +2039,10 @@ def build_app(
|
|
|
1973
2039
|
# missing graph and set core.hooksPath, on the machines that
|
|
1974
2040
|
# actually run workers rather than only on the operator's laptop.
|
|
1975
2041
|
Route("/graph-fix", graph_fix, methods=["POST"]),
|
|
2042
|
+
# #2373: `coord release propagate`'s drain-deadline escalation's
|
|
2043
|
+
# per-machine self-heal — resolve a `running` drive-queue entry this
|
|
2044
|
+
# host launched before the escalation fires loudly.
|
|
2045
|
+
Route("/drive-queue-reconcile", drive_queue_reconcile, methods=["POST"]),
|
|
1976
2046
|
# #305: artifact stash manifest (GET /artifact/<repo>/<branch>)
|
|
1977
2047
|
Route("/artifact/{repo}/{branch}", artifact_manifest, methods=["GET"]),
|
|
1978
2048
|
# #207: CPU + memory snapshot for TUI sparklines
|
|
@@ -2761,11 +2761,18 @@ def drive_queue_tick(
|
|
|
2761
2761
|
gates=" | ".join(plan.alert.details),
|
|
2762
2762
|
command=plan.alert.command,
|
|
2763
2763
|
)
|
|
2764
|
-
|
|
2765
|
-
#
|
|
2766
|
-
#
|
|
2767
|
-
# the
|
|
2768
|
-
#
|
|
2764
|
+
else:
|
|
2765
|
+
# #2381: ANY resolved alert-raising condition — a released hold,
|
|
2766
|
+
# a lapsed/cleared cordon, a fixed editable-drift checkout — must
|
|
2767
|
+
# drop the stale escalation record in the SAME tick it resolves,
|
|
2768
|
+
# or `status` (and the TUI/`decisions` report reading the same
|
|
2769
|
+
# record) keeps shouting the old reason while the queue is
|
|
2770
|
+
# demonstrably running again. This used to be gated on `any(h.
|
|
2771
|
+
# outcome == "released" for h in plan.holds)` — the deploy-gate
|
|
2772
|
+
# case only — so a cleared CORDON (no `plan.holds` entry at all)
|
|
2773
|
+
# never cleared its own stale alert. `_clear_queue_alert()` is a
|
|
2774
|
+
# no-op when there is nothing to dismiss, so calling it on every
|
|
2775
|
+
# alert-free tick is safe and cheap.
|
|
2769
2776
|
_clear_queue_alert()
|
|
2770
2777
|
|
|
2771
2778
|
target = plan.launch
|
|
@@ -503,6 +503,77 @@ def _post(url: str, payload: dict, *, timeout: float) -> tuple[int | None, dict,
|
|
|
503
503
|
return resp.status_code, (body if isinstance(body, dict) else {}), ""
|
|
504
504
|
|
|
505
505
|
|
|
506
|
+
#: #2373: default timeout for the remote-reconcile POST below. Generous, but
|
|
507
|
+
#: still small next to `DEFAULT_DRAIN_DEADLINE_SECONDS` (90 minutes), so a
|
|
508
|
+
#: wedged/unreachable agent never turns "ask before escalating" into a
|
|
509
|
+
#: second, longer wait before the loud message an operator is actually
|
|
510
|
+
#: watching for. The POST body forwards a *shorter* remote-subprocess
|
|
511
|
+
#: timeout (see `_RECONCILE_TIMEOUT_MARGIN_SECONDS` below) so the remote
|
|
512
|
+
#: agent's own tick (`AgentServer.reconcile_drive_queue`, otherwise 120s by
|
|
513
|
+
#: default) can never outlive this wait — without that, a tick legitimately
|
|
514
|
+
#: taking longer than this timeout would surface here as a misleading
|
|
515
|
+
#: "unreachable" even though it was still running and would have resolved
|
|
516
|
+
#: correctly on its own.
|
|
517
|
+
DEFAULT_RECONCILE_TIMEOUT_SECONDS = 30.0
|
|
518
|
+
|
|
519
|
+
#: Margin subtracted from *timeout* before it is forwarded as the remote
|
|
520
|
+
#: subprocess's own timeout (see `_reconcile_launch_host`) — leaves the
|
|
521
|
+
#: agent's HTTP handler room to marshal and return its response before
|
|
522
|
+
#: this side's own `httpx` deadline fires.
|
|
523
|
+
_RECONCILE_TIMEOUT_MARGIN_SECONDS = 5.0
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
def _reconcile_launch_host(
|
|
527
|
+
machine_host: str,
|
|
528
|
+
*,
|
|
529
|
+
agent_port: int,
|
|
530
|
+
timeout: float = DEFAULT_RECONCILE_TIMEOUT_SECONDS,
|
|
531
|
+
post=None,
|
|
532
|
+
) -> tuple[bool | None, str]:
|
|
533
|
+
"""Ask *machine_host*'s own agent to run a local reconcile-only tick
|
|
534
|
+
(#2373), over the same ``POST /<verb>`` HTTP pattern ``/graph-fix``
|
|
535
|
+
already uses for a per-machine self-heal fanned out from elsewhere.
|
|
536
|
+
|
|
537
|
+
Why this has to be a REMOTE call rather than something run locally by
|
|
538
|
+
whichever host happens to be executing `coord release propagate`: the
|
|
539
|
+
#1870 cross-host guard (`coord.drive_queue._reconcile_running`) is keyed
|
|
540
|
+
on a LOCAL tmux read, so only the machine that actually launched a
|
|
541
|
+
`running` drive-queue entry can ever resolve whether it is still alive.
|
|
542
|
+
A non-daemon launch host has no periodic tick of its own — confirmed
|
|
543
|
+
live 2026-08-18 (claude-coordinator#2360): elitebook ran only
|
|
544
|
+
`coord-agent.service`, dellserver's `coord-drive-queue.timer` correctly
|
|
545
|
+
refused to declare a foreign-host entry dead every time it ticked, and
|
|
546
|
+
the ambiguity sat wedging the fleet's release drain for ~17h until a
|
|
547
|
+
human happened to SSH in and run this exact command by hand. Routing it
|
|
548
|
+
through the agent HTTP API that already runs on every machine capable of
|
|
549
|
+
launching a drive closes that gap without a new timer unit anywhere.
|
|
550
|
+
|
|
551
|
+
Returns ``(ok, detail)``. ``ok`` is ``None`` when the call could not even
|
|
552
|
+
be attempted (never treated as a *failure* by the caller — see
|
|
553
|
+
:func:`_escalate_drain`), ``False`` on an unreachable agent or a non-200
|
|
554
|
+
response, ``True`` when the agent ran the tick (its own exit code, not
|
|
555
|
+
"and it resolved the entry" — a genuinely still-busy host is expected to
|
|
556
|
+
report ``ok=True`` with nothing to reconcile).
|
|
557
|
+
|
|
558
|
+
The POST body forwards a remote subprocess timeout derived from
|
|
559
|
+
*timeout* itself (minus `_RECONCILE_TIMEOUT_MARGIN_SECONDS`) rather than
|
|
560
|
+
leaving the remote agent to fall back to its own 120s default
|
|
561
|
+
(`AgentServer.reconcile_drive_queue`) — otherwise a tick that legitimately
|
|
562
|
+
takes longer than this call's own HTTP wait reports here as
|
|
563
|
+
`ok=False, detail="unreachable: ..."` even though it is still running and
|
|
564
|
+
will resolve correctly on its own, just not attributed to this call.
|
|
565
|
+
"""
|
|
566
|
+
poster = post or _post
|
|
567
|
+
url = f"http://{machine_host}:{agent_port}/drive-queue-reconcile"
|
|
568
|
+
remote_timeout = max(1.0, timeout - _RECONCILE_TIMEOUT_MARGIN_SECONDS)
|
|
569
|
+
status, body, err = poster(url, {"timeout": remote_timeout}, timeout=timeout)
|
|
570
|
+
if err:
|
|
571
|
+
return False, f"unreachable: {err}"
|
|
572
|
+
if status != 200:
|
|
573
|
+
return False, f"HTTP {status}: {body.get('detail') or body}"
|
|
574
|
+
return bool(body.get("ok")), str(body.get("detail") or "")
|
|
575
|
+
|
|
576
|
+
|
|
506
577
|
def _lane_versions_by_host(report) -> dict[str, list[str | None]]:
|
|
507
578
|
out: dict[str, list[str | None]] = {}
|
|
508
579
|
for lane in report.lanes:
|
|
@@ -791,6 +862,11 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
791
862
|
max_deferrals=cordon_max_deferrals,
|
|
792
863
|
release_cooldown=cordon_cooldown,
|
|
793
864
|
daemon_host=daemon_name,
|
|
865
|
+
# #2373: lets a blown drain deadline ask the escalated host's own
|
|
866
|
+
# agent to resolve the #1870 cross-host liveness ambiguity locally
|
|
867
|
+
# before the loud message goes out — see `_reconcile_launch_host`.
|
|
868
|
+
machines=getattr(config, "machines", ()) or (),
|
|
869
|
+
agent_port=AGENT_PORT,
|
|
794
870
|
)
|
|
795
871
|
|
|
796
872
|
if fully_busy and not force:
|
|
@@ -1162,6 +1238,9 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
|
|
|
1162
1238
|
max_deferrals: int | None = None,
|
|
1163
1239
|
release_cooldown: float | None = None,
|
|
1164
1240
|
daemon_host: str | None = None,
|
|
1241
|
+
machines=None,
|
|
1242
|
+
agent_port: int | None = None,
|
|
1243
|
+
reconcile_timeout: float | None = None,
|
|
1165
1244
|
) -> dict:
|
|
1166
1245
|
"""Plan and apply this run's cordons. Returns the journal fragment.
|
|
1167
1246
|
|
|
@@ -1185,6 +1264,13 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
|
|
|
1185
1264
|
pre-#2240 behaviour) rather than to a spurious release: dropping the
|
|
1186
1265
|
fleet's cordon because a file could not be read is the wrong direction to
|
|
1187
1266
|
fail in.
|
|
1267
|
+
|
|
1268
|
+
#2373: *machines*/*agent_port* let each :class:`~coord.release_cordon.
|
|
1269
|
+
DrainEscalation` ask the escalated host's OWN agent to run a local
|
|
1270
|
+
reconcile-only tick before the loud message goes out — see
|
|
1271
|
+
:func:`_reconcile_launch_host`. ``machines=None`` (a caller with no fleet
|
|
1272
|
+
topology, e.g. a unit test exercising `plan_cordons` output directly)
|
|
1273
|
+
skips the remote call entirely and escalates exactly as before #2373.
|
|
1188
1274
|
"""
|
|
1189
1275
|
import time # noqa: PLC0415
|
|
1190
1276
|
|
|
@@ -1304,9 +1390,39 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
|
|
|
1304
1390
|
outcome.errors.append(f"release cordon {name}: {exc}")
|
|
1305
1391
|
click.echo(f" ✗ release cordon {name}: {exc}", err=True)
|
|
1306
1392
|
|
|
1393
|
+
machines_by_name = {m.name: m for m in (machines or ())}
|
|
1394
|
+
# #2373: each escalation below makes one synchronous `_reconcile_launch_host`
|
|
1395
|
+
# HTTP call, serially, each blocking up to ~`DEFAULT_RECONCILE_TIMEOUT_SECONDS`.
|
|
1396
|
+
# With multiple simultaneously-overdue hosts this adds up to N * timeout of
|
|
1397
|
+
# latency inside one `release propagate` invocation. Fine today — escalations
|
|
1398
|
+
# are rare and few at once — but if that ever stops being true, parallelize
|
|
1399
|
+
# this loop (e.g. a thread pool over `plan.escalations`) rather than letting
|
|
1400
|
+
# a single propagate call silently grow with fleet size.
|
|
1307
1401
|
for escalation in plan.escalations:
|
|
1308
|
-
|
|
1309
|
-
|
|
1402
|
+
# #2373: before the loud message, give the escalated host's OWN
|
|
1403
|
+
# agent one chance to resolve the ambiguity that is actually holding
|
|
1404
|
+
# it — see `_reconcile_launch_host`'s docstring. `machine` missing
|
|
1405
|
+
# from the fleet map, or no `agent_port` supplied (a caller with no
|
|
1406
|
+
# HTTP topology), skips the call rather than guessing an address.
|
|
1407
|
+
reconcile_ok: bool | None = None
|
|
1408
|
+
reconcile_detail = ""
|
|
1409
|
+
target = machines_by_name.get(escalation.machine)
|
|
1410
|
+
if target is not None and agent_port:
|
|
1411
|
+
reconcile_ok, reconcile_detail = _reconcile_launch_host(
|
|
1412
|
+
target.host,
|
|
1413
|
+
agent_port=agent_port,
|
|
1414
|
+
timeout=(
|
|
1415
|
+
DEFAULT_RECONCILE_TIMEOUT_SECONDS
|
|
1416
|
+
if reconcile_timeout is None
|
|
1417
|
+
else reconcile_timeout
|
|
1418
|
+
),
|
|
1419
|
+
)
|
|
1420
|
+
_escalate_drain(escalation, reconcile_ok=reconcile_ok, reconcile_detail=reconcile_detail)
|
|
1421
|
+
outcome.escalated.append({
|
|
1422
|
+
**escalation.to_dict(),
|
|
1423
|
+
"reconcile_ok": reconcile_ok,
|
|
1424
|
+
"reconcile_detail": reconcile_detail,
|
|
1425
|
+
})
|
|
1310
1426
|
|
|
1311
1427
|
return outcome.to_dict()
|
|
1312
1428
|
|
|
@@ -1321,7 +1437,9 @@ DRAIN_ALERT_ISSUE = 0
|
|
|
1321
1437
|
DRAIN_ALERT_STAGE = "release-cordon"
|
|
1322
1438
|
|
|
1323
1439
|
|
|
1324
|
-
def _escalate_drain(
|
|
1440
|
+
def _escalate_drain(
|
|
1441
|
+
escalation, *, reconcile_ok: bool | None = None, reconcile_detail: str = ""
|
|
1442
|
+
) -> None:
|
|
1325
1443
|
"""Surface a host that will not drain — loudly, in three places.
|
|
1326
1444
|
|
|
1327
1445
|
stderr (the timer's journal), the escalation table (the TUI and
|
|
@@ -1329,21 +1447,43 @@ def _escalate_drain(escalation) -> None:
|
|
|
1329
1447
|
criterion 4 is explicitly about the surfaced MESSAGE rather than an
|
|
1330
1448
|
internal state change, because a silent forever-wait is the failure this
|
|
1331
1449
|
whole mechanism replaces.
|
|
1450
|
+
|
|
1451
|
+
#2373: *reconcile_ok*/*reconcile_detail* are the outcome of the remote
|
|
1452
|
+
reconcile-only tick `_apply_cordons` asked the escalated host's own
|
|
1453
|
+
agent to run just before calling this — ``None`` when that call was
|
|
1454
|
+
never attempted (no fleet topology / agent port available), so the
|
|
1455
|
+
message stays byte-identical to before #2373 in that case. When it WAS
|
|
1456
|
+
attempted, the outcome is folded into the same message rather than a
|
|
1457
|
+
second alert, so an operator reading one escalation sees both "this is
|
|
1458
|
+
overdue" and "here is what the self-heal attempt already found" without
|
|
1459
|
+
correlating two records.
|
|
1332
1460
|
"""
|
|
1333
|
-
|
|
1461
|
+
reconcile_note = ""
|
|
1462
|
+
if reconcile_ok is not None:
|
|
1463
|
+
verb = "ok" if reconcile_ok else "failed"
|
|
1464
|
+
detail = f" ({reconcile_detail})" if reconcile_detail else ""
|
|
1465
|
+
reconcile_note = (
|
|
1466
|
+
f" — asked {escalation.machine}'s own agent to run a local "
|
|
1467
|
+
f"reconcile-only tick first (#2373): {verb}{detail}"
|
|
1468
|
+
)
|
|
1469
|
+
message = f"{escalation.message}{reconcile_note}"
|
|
1470
|
+
click.echo(f" ! {message}", err=True)
|
|
1334
1471
|
try:
|
|
1335
1472
|
from coord.state import record_drive_escalation # noqa: PLC0415
|
|
1336
1473
|
|
|
1474
|
+
gate_readings = (
|
|
1475
|
+
f"machine={escalation.machine} | "
|
|
1476
|
+
f"waited={escalation.waited_seconds:.0f}s | "
|
|
1477
|
+
f"deadline={escalation.deadline_seconds:.0f}s"
|
|
1478
|
+
)
|
|
1479
|
+
if reconcile_ok is not None:
|
|
1480
|
+
gate_readings += f" | remote_reconcile={'ok' if reconcile_ok else 'failed'}"
|
|
1337
1481
|
record_drive_escalation(
|
|
1338
1482
|
DRAIN_ALERT_REPO,
|
|
1339
1483
|
DRAIN_ALERT_ISSUE,
|
|
1340
1484
|
stage=DRAIN_ALERT_STAGE,
|
|
1341
|
-
reason=
|
|
1342
|
-
gate_readings=
|
|
1343
|
-
f"machine={escalation.machine} | "
|
|
1344
|
-
f"waited={escalation.waited_seconds:.0f}s | "
|
|
1345
|
-
f"deadline={escalation.deadline_seconds:.0f}s"
|
|
1346
|
-
),
|
|
1485
|
+
reason=message,
|
|
1486
|
+
gate_readings=gate_readings,
|
|
1347
1487
|
proposed_command=escalation.command,
|
|
1348
1488
|
)
|
|
1349
1489
|
except Exception as exc: # noqa: BLE001 — the stderr line above is the
|
|
@@ -2181,24 +2321,19 @@ def _run_reconcile_tick(config_path: Path, *, runner=None) -> tuple[bool, str]:
|
|
|
2181
2321
|
*after* the timer stopped would stay stuck ``running`` for the rest of
|
|
2182
2322
|
the drain no matter how generous the deadline is — the exact deadlock
|
|
2183
2323
|
#2110 fixed reconciliation to no longer require the timer for.
|
|
2324
|
+
|
|
2325
|
+
Thin wrapper around :func:`coord.reconcile_tick.run_reconcile_tick`, the
|
|
2326
|
+
#2373-extracted shared implementation also used by
|
|
2327
|
+
`AgentServer.reconcile_drive_queue` (`coord/agent.py`) — see that
|
|
2328
|
+
module's docstring for why there must be exactly one implementation of
|
|
2329
|
+
"what a reconcile-only tick does". A failure here is not fatal on its
|
|
2330
|
+
own: the quiescence check right after this call is the real signal a
|
|
2331
|
+
stuck reconcile eventually clears on a later poll, not this one call's
|
|
2332
|
+
job to guarantee.
|
|
2184
2333
|
"""
|
|
2185
|
-
import
|
|
2334
|
+
from coord.reconcile_tick import run_reconcile_tick # noqa: PLC0415
|
|
2186
2335
|
|
|
2187
|
-
|
|
2188
|
-
try:
|
|
2189
|
-
proc = run(
|
|
2190
|
-
[sys.executable, "-m", "coord.cli", "drive-queue", "tick",
|
|
2191
|
-
"--reconcile-only", "--config", str(config_path)],
|
|
2192
|
-
capture_output=True, text=True, timeout=120,
|
|
2193
|
-
)
|
|
2194
|
-
except Exception as exc: # noqa: BLE001 — best effort; the quiescence
|
|
2195
|
-
# check right after this call is the real signal a stuck reconcile
|
|
2196
|
-
# eventually clears on a later poll, not this one call's job to
|
|
2197
|
-
# guarantee.
|
|
2198
|
-
return False, f"{type(exc).__name__}: {exc}"
|
|
2199
|
-
ok = getattr(proc, "returncode", 1) == 0
|
|
2200
|
-
detail = (getattr(proc, "stderr", "") or getattr(proc, "stdout", "") or "").strip()
|
|
2201
|
-
return ok, detail[:200]
|
|
2336
|
+
return run_reconcile_tick(config_path, timeout=120, detail_limit=200, runner=runner)
|
|
2202
2337
|
|
|
2203
2338
|
|
|
2204
2339
|
def _drain(
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""Shared primitive: run ``coord drive-queue tick --reconcile-only`` as a
|
|
2
|
+
subprocess and report ``(ok, detail)``.
|
|
3
|
+
|
|
4
|
+
Two independent surfaces need to run this exact command — the real CLI path,
|
|
5
|
+
with its own file lock (`coord.filelock.drive_queue_lock_path`) against a
|
|
6
|
+
concurrently-running timer tick on the same host, and its own ``--config``
|
|
7
|
+
resolution:
|
|
8
|
+
|
|
9
|
+
* ``coord release propagate``'s drain loop (`coord/commands/release.py`,
|
|
10
|
+
`_run_reconcile_tick`, #2110) — polls this on every iteration so a drive
|
|
11
|
+
that finishes *after* `coord-drive-queue.timer` has been stopped for the
|
|
12
|
+
drain still gets reconciled from ``running`` to ``done``.
|
|
13
|
+
* `AgentServer.reconcile_drive_queue` (`coord/agent.py`, #2373) — reachable
|
|
14
|
+
over the agent's HTTP API so `coord release propagate`'s drain-deadline
|
|
15
|
+
escalation can ask a non-daemon ``launch_host`` to resolve its own
|
|
16
|
+
cross-host liveness ambiguity (`coord.drive_queue._reconcile_running`'s
|
|
17
|
+
#1870 guard) before escalating loudly. See ``docs/AGENT_OPERATIONS.md``'s
|
|
18
|
+
#2373 section for the full incident writeup.
|
|
19
|
+
|
|
20
|
+
Per this repo's rule (CLAUDE.md, epic #2096): if two surfaces answer the
|
|
21
|
+
same question, they must call the same function. This is that function —
|
|
22
|
+
not two hand-maintained copies that quietly drift apart (as #2373's review
|
|
23
|
+
found: a hardcoded 120s timeout vs. a caller-supplied one, and a 200-char
|
|
24
|
+
detail truncation vs. a 2000-char one).
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import subprocess
|
|
30
|
+
import sys
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def run_reconcile_tick(
|
|
35
|
+
config_path: Path | str,
|
|
36
|
+
*,
|
|
37
|
+
timeout: float = 120.0,
|
|
38
|
+
detail_limit: int = 2000,
|
|
39
|
+
runner=None,
|
|
40
|
+
) -> tuple[bool, str]:
|
|
41
|
+
"""Run ``coord drive-queue tick --reconcile-only --config <config_path>``.
|
|
42
|
+
|
|
43
|
+
Never raises: a timeout or any other subprocess failure comes back as
|
|
44
|
+
``(False, "<ExceptionType>: <message>")`` rather than propagating — both
|
|
45
|
+
callers treat this as a best-effort step inside a larger loop/escalation,
|
|
46
|
+
not a gate that may take the caller down with it.
|
|
47
|
+
|
|
48
|
+
*runner* is the `subprocess.run`-shaped seam tests substitute; *timeout*
|
|
49
|
+
and *detail_limit* let each caller keep its own existing behavior
|
|
50
|
+
(`_run_reconcile_tick`'s 120s/200-char vs. `reconcile_drive_queue`'s
|
|
51
|
+
caller-supplied timeout/2000-char) without re-implementing the command
|
|
52
|
+
itself twice.
|
|
53
|
+
"""
|
|
54
|
+
run = runner or subprocess.run
|
|
55
|
+
try:
|
|
56
|
+
proc = run(
|
|
57
|
+
[sys.executable, "-m", "coord.cli", "drive-queue", "tick",
|
|
58
|
+
"--reconcile-only", "--config", str(config_path)],
|
|
59
|
+
capture_output=True, text=True, timeout=timeout,
|
|
60
|
+
)
|
|
61
|
+
except Exception as exc: # noqa: BLE001 — best effort, see docstring
|
|
62
|
+
return False, f"{type(exc).__name__}: {exc}"
|
|
63
|
+
ok = getattr(proc, "returncode", 1) == 0
|
|
64
|
+
detail = (getattr(proc, "stderr", "") or getattr(proc, "stdout", "") or "").strip()
|
|
65
|
+
return ok, detail[:detail_limit]
|
|
@@ -1028,6 +1028,48 @@ the gate's dependents stop themselves (the whole queue too, if the entry was
|
|
|
1028
1028
|
declared `--scope=fleet` — #2186), propagation sees a *fired* gate as the
|
|
1029
1029
|
opposite of busy, rolls, and releases the hold.
|
|
1030
1030
|
|
|
1031
|
+
**#2373 (fixed 2026-08-18): a launch-host-only liveness ambiguity had no
|
|
1032
|
+
machine assigned to resolve it.** `_reconcile_running`'s #1870 cross-host
|
|
1033
|
+
guard (`coord/drive_queue.py`) is correct and load-bearing: a tick's tmux
|
|
1034
|
+
read is always LOCAL, so a `running` entry launched on a *different* host
|
|
1035
|
+
than the one ticking must read as `unknown`, never dead — declaring it dead
|
|
1036
|
+
from the wrong machine is exactly the false-positive #1870 exists to
|
|
1037
|
+
prevent. But only `coord-drive-queue.timer` on the daemon host ticks the
|
|
1038
|
+
queue at all; a machine that only runs `coord-agent.service` (precision,
|
|
1039
|
+
elitebook) never runs its own tick, so an entry launched there sits
|
|
1040
|
+
`running`/`unknown` forever if it actually died — there is no periodic
|
|
1041
|
+
process anywhere whose job is to resolve it. Confirmed live 2026-08-18
|
|
1042
|
+
(claude-coordinator#2360): an entry launched on elitebook sat `running` for
|
|
1043
|
+
~17h; every dellserver tick correctly refused to declare it dead; elitebook's
|
|
1044
|
+
release-cordon (which #2101/#2136 renews on every tick that finds the host
|
|
1045
|
+
"still busy") kept renewing past its drain deadline and re-escalated with
|
|
1046
|
+
nothing ever resolving the ambiguity. Running `coord drive-queue tick
|
|
1047
|
+
--reconcile-only` locally on elitebook resolved it in one call — the entry
|
|
1048
|
+
moved to `parked` (waiting on a CI re-check, #1891), not actually dead.
|
|
1049
|
+
|
|
1050
|
+
The fix closes the loop inside the drain-deadline escalation itself, so it
|
|
1051
|
+
needs no new timer unit anywhere: before `_apply_cordons` surfaces a
|
|
1052
|
+
`DrainEscalation` (the loud `DRAIN OVERDUE: ...` message), it first `POST`s
|
|
1053
|
+
to the escalated host's own agent — `POST /drive-queue-reconcile`
|
|
1054
|
+
(`coord/agent_app.py`, handled by `AgentServer.reconcile_drive_queue` in
|
|
1055
|
+
`coord/agent.py`) — which shells out to `coord drive-queue tick
|
|
1056
|
+
--reconcile-only` *on that machine*, so the #1870 guard's own local-tmux-read
|
|
1057
|
+
requirement is satisfied by construction: the host asked is the host whose
|
|
1058
|
+
evidence actually counts. The outcome (`ok`/`detail`) is folded into the SAME
|
|
1059
|
+
escalation message and escalation-table record rather than a second alert —
|
|
1060
|
+
"DRAIN OVERDUE: elitebook has been cordoned for 91m ... — asked elitebook's
|
|
1061
|
+
own agent to run a local reconcile-only tick first (#2373): ok (moved to
|
|
1062
|
+
parked)". An unreachable agent does not suppress the escalation; the loud
|
|
1063
|
+
message still goes out, with the failed self-heal attempt named rather than
|
|
1064
|
+
hidden. Every machine capable of launching a drive already runs
|
|
1065
|
+
`coord-agent.service`, so no fleet ever needs a new unit installed for this
|
|
1066
|
+
to work; a machine with no local `coordinator.yml` (thin-client/config-free
|
|
1067
|
+
mode) refuses the call cleanly (`no local coordinator.yml on this agent`)
|
|
1068
|
+
since it has nothing to pass as `--config`. See
|
|
1069
|
+
`tests/test_release_cordon_2101.py`'s `#2373` section for the seeded
|
|
1070
|
+
end-to-end shape (a `running` entry pinned to a non-daemon host, cordoned
|
|
1071
|
+
past the drain deadline, resolved without an operator SSH session).
|
|
1072
|
+
|
|
1031
1073
|
## `coord.db` backups to the external SSD (interim — #1822 owns the real thing)
|
|
1032
1074
|
|
|
1033
1075
|
`~/.coord/coord.db` on the daemon host is the fleet's canonical state and had
|