code-coordinator 0.5.96__tar.gz → 0.5.98__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.96 → code_coordinator-0.5.98}/PKG-INFO +1 -1
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dead_end.py +36 -7
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notify.py +52 -17
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/reconcile.py +289 -8
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/smoke.py +163 -3
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/stage_projection.py +10 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dead_end.py +38 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notify.py +289 -0
- code_coordinator-0.5.98/tests/test_reconcile_no_agent_record.py +538 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_smoke.py +234 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.gitignore +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/CLAUDE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/GOAL.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/LICENSE +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/MANIFEST.in +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/README.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agent.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/block_log.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/board_service.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/brain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/claim.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/client.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/comments.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/config.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dao.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/db.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deps.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/drive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/events.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/filelock.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/freshness.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/gates.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/goal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/context.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/models.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/render.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/units.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/hooks.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/interactive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/models.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/network.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/openapi.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/parentage.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/plans.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/progress.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/release_window.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/reports.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/review.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/split_work.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/test_author.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/test_report.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/usage.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/install-agent.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/pyproject.toml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/setup.cfg +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/conftest.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_db.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_events.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_init.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_models.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_network.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_session.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_split.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -674,6 +674,7 @@ tests/test_reap_stale_interactive_tick.py
|
|
|
674
674
|
tests/test_reconcile_branch.py
|
|
675
675
|
tests/test_reconcile_completions.py
|
|
676
676
|
tests/test_reconcile_merges.py
|
|
677
|
+
tests/test_reconcile_no_agent_record.py
|
|
677
678
|
tests/test_reconcile_usage_limit_done.py
|
|
678
679
|
tests/test_refine_chat.py
|
|
679
680
|
tests/test_release_cordon_2101.py
|
{code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -704,6 +704,7 @@
|
|
|
704
704
|
"tests/test_reconcile_branch.py",
|
|
705
705
|
"tests/test_reconcile_completions.py",
|
|
706
706
|
"tests/test_reconcile_merges.py",
|
|
707
|
+
"tests/test_reconcile_no_agent_record.py",
|
|
707
708
|
"tests/test_reconcile_usage_limit_done.py",
|
|
708
709
|
"tests/test_refine_chat.py",
|
|
709
710
|
"tests/test_release_cordon_2101.py",
|
|
@@ -232,26 +232,55 @@ def detect_dead_end(state, *, can_waive_test_gate: bool = False) -> DeadEnd | No
|
|
|
232
232
|
gates=_gates(state),
|
|
233
233
|
)
|
|
234
234
|
|
|
235
|
-
# ── shape 2: the Test stage is BLOCKED (#1672)
|
|
235
|
+
# ── shape 2: the Test stage is BLOCKED (#1672/#2272) ───────────────────
|
|
236
236
|
# `dispatch_smoke` stamps `test_state="blocked"` when no capability-
|
|
237
237
|
# matched machine could run the suite, and then REFUSES to re-probe on
|
|
238
238
|
# every tick — deliberately, that spin is what #1672 closed. So the
|
|
239
239
|
# driver polling for a verdict is polling for something the dispatcher
|
|
240
240
|
# has already decided not to produce. vimcode#635's shape, in the one
|
|
241
241
|
# variant the board makes provable.
|
|
242
|
+
#
|
|
243
|
+
# #2272 parks the SAME value for a second, unrelated cause: N Test-stage
|
|
244
|
+
# legs in a row finished without printing a `SMOKE:` marker and the retry
|
|
245
|
+
# budget ran out. Both are "no verdict is coming", which is why they
|
|
246
|
+
# share a state — but the recovery is completely different (fix the fleet
|
|
247
|
+
# vs. find out why the worker went mute, usually the 600s Bash ceiling),
|
|
248
|
+
# so they must not share a REASON. Telling the operator "no capability-
|
|
249
|
+
# matched machine" about a row whose machines were fine all along is the
|
|
250
|
+
# symptom-not-cause failure #2235 exists to measure, and it is one
|
|
251
|
+
# `mute_smoke_legs` call away from being avoided.
|
|
242
252
|
if state.work_test_state == TEST_STATE_BLOCKED:
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
f"{
|
|
253
|
+
from coord.smoke import mute_smoke_legs # noqa: PLC0415
|
|
254
|
+
|
|
255
|
+
mute_legs = mute_smoke_legs(state.work_test_reason)
|
|
256
|
+
if mute_legs:
|
|
257
|
+
cause = (
|
|
258
|
+
f"{mute_legs} Test-stage leg(s) in a row finished without "
|
|
259
|
+
"printing a `SMOKE:` verdict marker, exhausting the retry "
|
|
260
|
+
"budget, so coord.notify parked the row rather than "
|
|
261
|
+
"re-dispatching a cause that had already repeated identically "
|
|
262
|
+
"every lap (#2272). Nothing is known to be wrong with the "
|
|
263
|
+
"BRANCH — the commonest cause is the smoke command exceeding "
|
|
264
|
+
"the worker's 600s Bash ceiling, which backgrounds the run "
|
|
265
|
+
"and leaves the session with no exit status to report. Check "
|
|
266
|
+
"the last Test-stage transcript for a backgrounded command "
|
|
267
|
+
"before you blame the diff."
|
|
268
|
+
)
|
|
269
|
+
else:
|
|
270
|
+
cause = (
|
|
249
271
|
"coord.smoke.dispatch_smoke found no capability-matched "
|
|
250
272
|
"machine and recorded 'blocked' rather than re-probing a "
|
|
251
273
|
"broken fleet on every tick (#1672). It will not try again "
|
|
252
274
|
"on its own, so waiting for a verdict here waits forever "
|
|
253
275
|
"(#2019). Fix the fleet (or the capability rules), then "
|
|
254
276
|
"clear the marker."
|
|
277
|
+
)
|
|
278
|
+
return DeadEnd(
|
|
279
|
+
kind="test_stage_blocked",
|
|
280
|
+
stage="test",
|
|
281
|
+
reason=(
|
|
282
|
+
f"the Test stage for {state.work_aid} is BLOCKED: "
|
|
283
|
+
f"{state.work_test_reason or 'no reason recorded'} — {cause}"
|
|
255
284
|
),
|
|
256
285
|
recovery=(
|
|
257
286
|
f"coord diagnose {state.repo} {state.issue} --stage test --reset"
|
|
@@ -52,6 +52,16 @@ from coord.dispatch import (
|
|
|
52
52
|
post_refused_policy,
|
|
53
53
|
)
|
|
54
54
|
from coord.progress import parse_progress
|
|
55
|
+
|
|
56
|
+
# #2272: the mute-Test-stage retry budget. Canonically in `coord.smoke`
|
|
57
|
+
# because `dispatch_smoke` is the writer that has to carry the tally across
|
|
58
|
+
# its own `running` stamp — a second definition here is exactly how the
|
|
59
|
+
# counter and the thing that clobbers it drift apart again. Safe as a
|
|
60
|
+
# module-level import: `coord.smoke` reaches config/dispatch/models/revalidate
|
|
61
|
+
# and none of them import this module.
|
|
62
|
+
from coord.smoke import MUTE_SMOKE_LEG_BUDGET, TEST_STATE_BLOCKED
|
|
63
|
+
from coord.smoke import NO_SMOKE_VERDICT_MARKER as _NO_SMOKE_VERDICT_MARKER
|
|
64
|
+
from coord.smoke import mute_smoke_legs, mute_smoke_tally
|
|
55
65
|
from coord.state import (
|
|
56
66
|
load_dispatched,
|
|
57
67
|
load_done_reviews_needing_post,
|
|
@@ -1776,7 +1786,12 @@ def _smoke_worker_verdict(
|
|
|
1776
1786
|
#: ``test_reason`` when a headless smoke produced no parseable verdict. Read
|
|
1777
1787
|
#: back on the NEXT such reap to decide between "park for one automatic
|
|
1778
1788
|
#: re-dispatch" and "block, an operator has to look" — see below.
|
|
1779
|
-
|
|
1789
|
+
#:
|
|
1790
|
+
#: #2272: canonically defined in :mod:`coord.smoke` (imported at the top of
|
|
1791
|
+
#: this module), next to `dispatch_smoke` — the function that has to carry the
|
|
1792
|
+
#: tally across its own ``running`` stamp for this counter to survive at all.
|
|
1793
|
+
#: Re-bound here because this is the name the reap path has always used.
|
|
1794
|
+
NO_SMOKE_VERDICT_MARKER = _NO_SMOKE_VERDICT_MARKER
|
|
1780
1795
|
|
|
1781
1796
|
|
|
1782
1797
|
def _record_smoke_verdict(
|
|
@@ -1885,50 +1900,70 @@ def _record_smoke_verdict(
|
|
|
1885
1900
|
return
|
|
1886
1901
|
|
|
1887
1902
|
# No verdict line, clean session exit. NOT a pass.
|
|
1903
|
+
#
|
|
1904
|
+
# #2272: count the legs, don't just test for the marker's presence. The
|
|
1905
|
+
# tally lives at the FRONT of `test_reason` so a bounded `/board` preview
|
|
1906
|
+
# still carries it, and `dispatch_smoke` re-states it across the `running`
|
|
1907
|
+
# stamp that used to erase it. Together those two make this a real budget
|
|
1908
|
+
# rather than the never-firing one #2244 intended.
|
|
1888
1909
|
previous_reason = load_assignment_test_reason(parent_id) or ""
|
|
1889
|
-
|
|
1910
|
+
legs = mute_smoke_legs(previous_reason) + 1
|
|
1890
1911
|
reason = (
|
|
1891
|
-
f"{
|
|
1912
|
+
f"{mute_smoke_tally(legs)}: the Test-stage worker "
|
|
1892
1913
|
f"{transition.assignment_id} ended without printing a verdict marker "
|
|
1893
1914
|
"line, and a `claude -p` exit code says only that the session ended — "
|
|
1894
1915
|
"it is not a suite result."
|
|
1895
1916
|
)
|
|
1896
|
-
if
|
|
1917
|
+
if legs >= MUTE_SMOKE_LEG_BUDGET:
|
|
1897
1918
|
# The same park value `dispatch_smoke` uses for an unroutable stage
|
|
1898
1919
|
# (#1672): every gate that wants "passed"/"skipped" keeps the merge
|
|
1899
1920
|
# shut, `dispatch_pending_smoke` stops re-dispatching, and no fix
|
|
1900
1921
|
# round is burned on a branch nothing has found fault with.
|
|
1901
|
-
|
|
1902
|
-
|
|
1922
|
+
#
|
|
1923
|
+
# #2272: the terminal reason NAMES the cause and the count. "N smoke
|
|
1924
|
+
# legs produced no verdict" is a statement an operator can act on; the
|
|
1925
|
+
# five-lap incident presented as "the branch is slow" precisely
|
|
1926
|
+
# because nothing on the row ever said how many legs had gone mute.
|
|
1903
1927
|
record_test_verdict(
|
|
1904
1928
|
assignment_id=parent_id,
|
|
1905
1929
|
test_state=TEST_STATE_BLOCKED,
|
|
1906
1930
|
test_reason=(
|
|
1907
|
-
f"{reason}
|
|
1908
|
-
"
|
|
1909
|
-
"
|
|
1910
|
-
|
|
1931
|
+
f"{reason} {legs} smoke legs produced no verdict — the "
|
|
1932
|
+
f"Test-stage retry budget ({MUTE_SMOKE_LEG_BUDGET}) is "
|
|
1933
|
+
"exhausted, so the row is parked instead of re-dispatched "
|
|
1934
|
+
"(#2272). A mute leg is not a failing branch: check whether "
|
|
1935
|
+
"the smoke command is exceeding the worker's 600s Bash "
|
|
1936
|
+
"ceiling before you blame the diff. Recover with `coord "
|
|
1937
|
+
"diagnose <repo> <issue> --stage test --reset`, or record the "
|
|
1938
|
+
f"verdict by hand with `coord test --passed|--fail "
|
|
1939
|
+
f"{parent_id}`."
|
|
1911
1940
|
),
|
|
1912
1941
|
)
|
|
1913
1942
|
log.warning(
|
|
1914
|
-
"smoke %s: no SMOKE: verdict in the transcript
|
|
1915
|
-
"
|
|
1916
|
-
|
|
1943
|
+
"smoke %s: no SMOKE: verdict in the transcript — that is %d mute "
|
|
1944
|
+
"Test-stage leg(s) on parent %s and the retry budget (%d) is "
|
|
1945
|
+
"exhausted, so parking test_state=%r instead of re-dispatching "
|
|
1946
|
+
"(#2272). Check the worker's 600s Bash ceiling first.",
|
|
1947
|
+
transition.assignment_id, legs, parent_id, MUTE_SMOKE_LEG_BUDGET,
|
|
1948
|
+
TEST_STATE_BLOCKED,
|
|
1917
1949
|
)
|
|
1918
1950
|
return
|
|
1919
1951
|
|
|
1952
|
+
remaining = MUTE_SMOKE_LEG_BUDGET - legs
|
|
1920
1953
|
record_test_verdict(
|
|
1921
1954
|
assignment_id=parent_id,
|
|
1922
1955
|
test_state=None,
|
|
1923
1956
|
test_reason=(
|
|
1924
|
-
f"{reason} Cleared for
|
|
1925
|
-
"
|
|
1957
|
+
f"{reason} Cleared for a Test-stage re-dispatch; {remaining} of "
|
|
1958
|
+
f"{MUTE_SMOKE_LEG_BUDGET} legs left in the budget before the row "
|
|
1959
|
+
"parks instead (#2272)."
|
|
1926
1960
|
),
|
|
1927
1961
|
)
|
|
1928
1962
|
log.warning(
|
|
1929
1963
|
"smoke %s: no SMOKE: verdict in the transcript — recording NO verdict "
|
|
1930
|
-
"for parent %s (cleared for re-dispatch), never
|
|
1931
|
-
|
|
1964
|
+
"for parent %s (mute leg %d of %d, cleared for re-dispatch), never "
|
|
1965
|
+
"'passed' (#2244).",
|
|
1966
|
+
transition.assignment_id, parent_id, legs, MUTE_SMOKE_LEG_BUDGET,
|
|
1932
1967
|
)
|
|
1933
1968
|
|
|
1934
1969
|
|
|
@@ -10,7 +10,7 @@ import httpx
|
|
|
10
10
|
|
|
11
11
|
from typing import TYPE_CHECKING
|
|
12
12
|
|
|
13
|
-
from coord.config import Config
|
|
13
|
+
from coord.config import INTERACTIVE_SESSION_TYPES, Config
|
|
14
14
|
from coord.dispatch import AGENT_PORT
|
|
15
15
|
from coord.models import WORK_LIKE_TYPES, Assignment, Board, Machine
|
|
16
16
|
|
|
@@ -49,6 +49,120 @@ _AGENT_TERMINAL_STATUS = {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
|
|
52
|
+
# ── #2275: the agent has no record of this assignment ──────────────────────
|
|
53
|
+
#
|
|
54
|
+
# Pinned reason string, written verbatim to `assignments.failure_reason` when
|
|
55
|
+
# the no-record arm below reconciles a row. Asserted on by
|
|
56
|
+
# `tests/test_reconcile_no_agent_record.py` and (deliberately) the only thing
|
|
57
|
+
# a human or a downstream reader has to grep for to understand why a row went
|
|
58
|
+
# terminal without a worker verdict.
|
|
59
|
+
NO_AGENT_RECORD_REASON = (
|
|
60
|
+
"agent has no record of this assignment (present in neither its /status "
|
|
61
|
+
"`active` nor `completed` list) — the worker process is gone: the agent "
|
|
62
|
+
"restarted with its state lost, the machine rebooted, or the completion "
|
|
63
|
+
"rolled off the capped history before anything observed it (#2275)"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Minimum age (seconds since `dispatched_at`) before the no-record arm will
|
|
67
|
+
# reconcile a row.
|
|
68
|
+
#
|
|
69
|
+
# The positive disproof — "in neither list" — is what makes this arm safe;
|
|
70
|
+
# this window is the belt to its braces, and exists for exactly one shape:
|
|
71
|
+
# `AgentServer.assign()` builds the worktree BEFORE taking `self._lock` to
|
|
72
|
+
# insert into `self._assignments` (see the identical race window called out in
|
|
73
|
+
# `clean_worktrees`). Any dispatch path that learns an assignment id and
|
|
74
|
+
# writes a `running` board row without waiting for that insert would otherwise
|
|
75
|
+
# hand this arm a row the agent genuinely will know about a moment later. Two
|
|
76
|
+
# minutes is orders of magnitude longer than that window and orders of
|
|
77
|
+
# magnitude shorter than the 11 hours #2208 burned, so it costs nothing real.
|
|
78
|
+
#
|
|
79
|
+
# It is NOT a restart grace window — see `reconcile_completed_assignments`'
|
|
80
|
+
# docstring for why an agent restart does not produce a mass reap.
|
|
81
|
+
_NO_RECORD_GRACE_SECONDS = 120.0
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def is_attended_session(a: object) -> bool:
|
|
85
|
+
"""True when *a* is a human-attended session, not an agent subprocess (#2275).
|
|
86
|
+
|
|
87
|
+
The exclusion that keeps the no-record arm in
|
|
88
|
+
:func:`reconcile_completed_assignments` from reaping live work. An
|
|
89
|
+
attended session is launched into tmux/a PTY by ``coord assign
|
|
90
|
+
--interactive`` — it is not an agent subprocess, so it appears in NEITHER
|
|
91
|
+
the agent's ``active`` list NOR its ``completed`` list, for its whole
|
|
92
|
+
life. Without this check the no-record arm would reap every attended
|
|
93
|
+
session the moment it started, which is the #1658 failure mode (reaping
|
|
94
|
+
live headless workers) pointed at a human's own terminal.
|
|
95
|
+
|
|
96
|
+
Two independent discriminators, either of which is sufficient — this is a
|
|
97
|
+
reaping path, so it is deliberately over-inclusive:
|
|
98
|
+
|
|
99
|
+
* ``provider_name == "claude-pty"`` — stamped by every ``--interactive``
|
|
100
|
+
dispatch (the same discriminator :func:`is_interactive_merge_session`
|
|
101
|
+
and :meth:`coord.config.PipelineConfig.attention_threshold_for` use).
|
|
102
|
+
This is the load-bearing one: an interactive ``--fix-of``/
|
|
103
|
+
``--review-of``/``--smoke-of`` session shares its ``type`` with a
|
|
104
|
+
headless counterpart, so only ``provider_name`` tells them apart.
|
|
105
|
+
* ``type in`` :data:`coord.config.INTERACTIVE_SESSION_TYPES` — the
|
|
106
|
+
chat/troubleshoot/audit/refinement family, which has no headless
|
|
107
|
+
counterpart at all and never goes near an agent.
|
|
108
|
+
|
|
109
|
+
Dead attended sessions are reaped by their own path
|
|
110
|
+
(:func:`coord.interactive.reap_stale_interactive_sessions`, called from
|
|
111
|
+
:func:`reconcile`), which probes the actual tmux server rather than
|
|
112
|
+
inferring death from an agent's silence. That is the correct instrument
|
|
113
|
+
for them; this one must stay out of the way.
|
|
114
|
+
"""
|
|
115
|
+
if getattr(a, "provider_name", None) == "claude-pty":
|
|
116
|
+
return True
|
|
117
|
+
return getattr(a, "type", None) in INTERACTIVE_SESSION_TYPES
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def agent_has_no_record(status: dict, assignment_id: str) -> bool:
|
|
121
|
+
"""True when *status* positively shows the agent knows nothing of *assignment_id*.
|
|
122
|
+
|
|
123
|
+
#2275's whole point: ``/status`` carries ``active`` (everything the agent
|
|
124
|
+
has a live subprocess for) and ``completed`` (its capped terminal
|
|
125
|
+
history). An id in NEITHER is a **positive statement** about the agent's
|
|
126
|
+
state — "no record" — not an inference from silence, which is what the
|
|
127
|
+
old ``entry is None → continue`` conflated with "still running".
|
|
128
|
+
|
|
129
|
+
Fail-open on a payload that doesn't carry both keys. A response missing
|
|
130
|
+
``active`` cannot support the disproof (we would be inferring from
|
|
131
|
+
absence again, exactly the bug), so it is treated as "cannot tell" and
|
|
132
|
+
the caller leaves the row alone. This also means an older agent build,
|
|
133
|
+
or any future ``/status`` variant, degrades to today's behaviour rather
|
|
134
|
+
than to a reap.
|
|
135
|
+
"""
|
|
136
|
+
if not isinstance(status, dict):
|
|
137
|
+
return False
|
|
138
|
+
active = status.get("active")
|
|
139
|
+
completed = status.get("completed")
|
|
140
|
+
if not isinstance(active, list) or not isinstance(completed, list):
|
|
141
|
+
return False
|
|
142
|
+
for entries in (active, completed):
|
|
143
|
+
for e in entries:
|
|
144
|
+
if isinstance(e, dict) and e.get("id") == assignment_id:
|
|
145
|
+
return False
|
|
146
|
+
return True
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _no_record_grace_elapsed(a: Assignment, *, now: float | None = None) -> bool:
|
|
150
|
+
"""True when *a* is old enough for the no-record arm (:data:`_NO_RECORD_GRACE_SECONDS`).
|
|
151
|
+
|
|
152
|
+
A row with no ``dispatched_at`` at all is eligible: the grace window
|
|
153
|
+
guards a dispatch-time race, and a row that never recorded a dispatch
|
|
154
|
+
time is not in one.
|
|
155
|
+
"""
|
|
156
|
+
dispatched_at = getattr(a, "dispatched_at", None)
|
|
157
|
+
if not dispatched_at:
|
|
158
|
+
return True
|
|
159
|
+
try:
|
|
160
|
+
dispatched = float(dispatched_at)
|
|
161
|
+
except (TypeError, ValueError):
|
|
162
|
+
return True
|
|
163
|
+
return (time.time() if now is None else now) - dispatched >= _NO_RECORD_GRACE_SECONDS
|
|
164
|
+
|
|
165
|
+
|
|
52
166
|
def effective_agent_status(entry: dict) -> str:
|
|
53
167
|
"""The agent-reported status for *entry*, with #1534's ``done`` refusal.
|
|
54
168
|
|
|
@@ -143,7 +257,49 @@ def reconcile_completed_assignments(
|
|
|
143
257
|
|
|
144
258
|
Interactive sessions are tmux launches, not agent subprocesses, so they
|
|
145
259
|
never appear in the agent's ``completed`` list — a live attended session
|
|
146
|
-
can't be reaped by this path.
|
|
260
|
+
can't be reaped by this path. #2275 made that a CHECKED property rather
|
|
261
|
+
than an emergent one: see :func:`is_attended_session`.
|
|
262
|
+
|
|
263
|
+
**#2275 — the second reconcile arm: "the agent has no record of it".**
|
|
264
|
+
Until #2275 this function only ever acted on a row it found in the agent's
|
|
265
|
+
``completed`` history. Anything else hit a bare ``continue`` whose comment
|
|
266
|
+
read *"still active on the agent (or rolled off history) → leave it"* —
|
|
267
|
+
two cases with opposite correct handling, conflated, both left. That is
|
|
268
|
+
not a race: ``_COMPLETED_HISTORY_CAP`` is 25, so a leg that dies needs only
|
|
269
|
+
25 further completions on its machine before its id is gone from
|
|
270
|
+
``/status``, after which nothing on the daemon's 30s clock would ever look
|
|
271
|
+
at that row again. It cost claude-coordinator#2208 8 hours and both drive
|
|
272
|
+
attempts on an already-green branch; a human running ``coord status``
|
|
273
|
+
cleared it, and the branch was merge-READY 14 minutes later.
|
|
274
|
+
|
|
275
|
+
The fix is a positive disproof: ``/status`` carries both ``active`` and
|
|
276
|
+
``completed``, and an id in NEITHER is a statement about the agent's state,
|
|
277
|
+
not an inference from its silence. Those — and only those — are
|
|
278
|
+
reconciled, to ``failed`` (never ``done``) with :data:`NO_AGENT_RECORD_
|
|
279
|
+
REASON`. See :func:`agent_has_no_record` and
|
|
280
|
+
:func:`_reconcile_no_agent_record`.
|
|
281
|
+
|
|
282
|
+
Three guards, because **this arm reaps** and #1658 is what getting that
|
|
283
|
+
wrong looks like in production:
|
|
284
|
+
|
|
285
|
+
1. :func:`is_attended_session` — attended sessions appear in neither list
|
|
286
|
+
for their whole life. Reaping them is the regression that costs real
|
|
287
|
+
work; :func:`coord.interactive.reap_stale_interactive_sessions` owns
|
|
288
|
+
them, and it probes tmux rather than guessing.
|
|
289
|
+
2. An unreachable agent still short-circuits at ``if not status`` above,
|
|
290
|
+
unweakened. **No record and no answer are different things.**
|
|
291
|
+
3. :data:`_NO_RECORD_GRACE_SECONDS` since ``dispatched_at``.
|
|
292
|
+
|
|
293
|
+
On **agent restart** (the ``coord agent update`` roll) this is deliberately
|
|
294
|
+
NOT a mass reap, and not because of the grace window: ``AgentServer.
|
|
295
|
+
_load_state`` restores the persisted assignments and rewrites every
|
|
296
|
+
``pending``/``running`` one to ``failed`` with *"agent restarted;
|
|
297
|
+
subprocess lost"* before the first ``/status`` is served. Those rows are
|
|
298
|
+
therefore IN ``completed``, and the ordinary path above handles them with a
|
|
299
|
+
real reason. Genuinely-empty ``active`` + ``completed`` means the agent
|
|
300
|
+
lost its state file too (fresh install, corrupt state moved aside by
|
|
301
|
+
#1421's handler) — and there the workers really are gone, so reconciling
|
|
302
|
+
every row on that machine is the correct answer rather than an accident.
|
|
147
303
|
|
|
148
304
|
Returns one dict per reconciled assignment (empty when nothing changed).
|
|
149
305
|
"""
|
|
@@ -182,7 +338,22 @@ def reconcile_completed_assignments(
|
|
|
182
338
|
None,
|
|
183
339
|
)
|
|
184
340
|
if entry is None:
|
|
185
|
-
|
|
341
|
+
# #2275: NOT in `completed` has two causes with OPPOSITE correct
|
|
342
|
+
# handling — "still running on the agent" (leave it) and "the
|
|
343
|
+
# agent has no record of it at all" (reconcile it). This used to
|
|
344
|
+
# be a bare `continue` that named both cases in a comment and
|
|
345
|
+
# then left both, so a row in the second case was re-skipped every
|
|
346
|
+
# 30s forever while `status` read `running` (#2208: 8 hours and
|
|
347
|
+
# both drive attempts burned on an already-green branch).
|
|
348
|
+
# `agent_has_no_record` tells them apart from the `active` list —
|
|
349
|
+
# a positive disproof, not an inference from silence.
|
|
350
|
+
if (
|
|
351
|
+
agent_has_no_record(status, aid)
|
|
352
|
+
and not is_attended_session(a)
|
|
353
|
+
and _no_record_grace_elapsed(a)
|
|
354
|
+
):
|
|
355
|
+
_reconcile_no_agent_record(a, aid, update_state_fn, reconciled)
|
|
356
|
+
continue
|
|
186
357
|
# #1534: `effective_agent_status` refuses an agent-reported `done`
|
|
187
358
|
# that also carries a usage-limit-kill reason — the daemon's passive
|
|
188
359
|
# tick is the FIRST place most completions are observed, so without
|
|
@@ -325,8 +496,83 @@ def reconcile_completed_assignments(
|
|
|
325
496
|
return reconciled
|
|
326
497
|
|
|
327
498
|
|
|
499
|
+
def _reconcile_no_agent_record(
|
|
500
|
+
a: Assignment,
|
|
501
|
+
aid: str,
|
|
502
|
+
update_state_fn,
|
|
503
|
+
reconciled: list[dict],
|
|
504
|
+
) -> None:
|
|
505
|
+
"""#2275: flip a ``running`` row the agent has no record of to ``failed``.
|
|
506
|
+
|
|
507
|
+
Called from :func:`reconcile_completed_assignments` only, and only once
|
|
508
|
+
all three guards there have passed (positive disproof, not attended, past
|
|
509
|
+
the grace window).
|
|
510
|
+
|
|
511
|
+
**``failed``, never ``done``.** This leg never reported a verdict, so the
|
|
512
|
+
one thing that must not happen is a silent flip to ``done`` — that
|
|
513
|
+
manufactures a pass and every downstream gate (review dispatch, the
|
|
514
|
+
acceptance gate, the merge queue) then behaves as if a slice exists that
|
|
515
|
+
nobody ever produced. A stall is bad; a manufactured pass is worse.
|
|
516
|
+
``failure_reason`` is the pinned :data:`NO_AGENT_RECORD_REASON`, so
|
|
517
|
+
``coord status``/the TUI/``coord drive`` all name the cause rather than
|
|
518
|
+
showing a failure with no explanation.
|
|
519
|
+
|
|
520
|
+
``exit_code`` is deliberately left ``None``: there is no reap, so there is
|
|
521
|
+
no exit code, and writing a fake one would be the same class of lie as
|
|
522
|
+
writing ``done``.
|
|
523
|
+
|
|
524
|
+
Kept passive, per this module's #1616 contract — it writes state through
|
|
525
|
+
the same ``update_state_fn`` seam and dispatches nothing. The ONE thing
|
|
526
|
+
it does beyond the write is the #1605 Test-stage propagation, which is not
|
|
527
|
+
a new side effect: it is the same call the ordinary ``terminal ==
|
|
528
|
+
"failed"`` path already makes, and skipping it would leave the parent
|
|
529
|
+
work row's ``test_state="running"`` forever — i.e. it would fix half of
|
|
530
|
+
#2208 and leave the other half stranded.
|
|
531
|
+
"""
|
|
532
|
+
update_state_fn(
|
|
533
|
+
assignment_id=aid,
|
|
534
|
+
terminal_status="failed",
|
|
535
|
+
branch=a.branch,
|
|
536
|
+
review_state=None,
|
|
537
|
+
failure_reason=NO_AGENT_RECORD_REASON,
|
|
538
|
+
exit_code=None,
|
|
539
|
+
)
|
|
540
|
+
|
|
541
|
+
if a.type == "smoke":
|
|
542
|
+
# #2275: environmental by construction, so state it rather than
|
|
543
|
+
# letting `classify_failure` guess. `NO_AGENT_RECORD_REASON` is
|
|
544
|
+
# coordinator-authored prose with no wire token in it, so the
|
|
545
|
+
# classifier would (correctly, by its own "default to work" rule)
|
|
546
|
+
# call it a WORK failure and record `test_state="failed"` — which
|
|
547
|
+
# spends a bounded `coord fix` round chasing a code defect that never
|
|
548
|
+
# existed, on a branch that in #2208's case was already green. A
|
|
549
|
+
# vanished worker is the machine's fault, not the work's; clearing
|
|
550
|
+
# the verdict lets `dispatch_pending_smoke` re-run the Test stage on
|
|
551
|
+
# its next tick, which is exactly what a human did in 14 minutes.
|
|
552
|
+
propagate_smoke_terminal_failure(
|
|
553
|
+
parent_assignment_id=a.review_of_assignment_id,
|
|
554
|
+
failure_reason=NO_AGENT_RECORD_REASON,
|
|
555
|
+
environmental=True,
|
|
556
|
+
)
|
|
557
|
+
|
|
558
|
+
reconciled.append(
|
|
559
|
+
{
|
|
560
|
+
"assignment_id": aid,
|
|
561
|
+
"issue_number": a.issue_number,
|
|
562
|
+
"repo": a.repo_name,
|
|
563
|
+
"type": a.type,
|
|
564
|
+
"to_status": "failed",
|
|
565
|
+
"plan_captured": False,
|
|
566
|
+
"reason": NO_AGENT_RECORD_REASON,
|
|
567
|
+
}
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
|
|
328
571
|
def propagate_smoke_terminal_failure(
|
|
329
|
-
*,
|
|
572
|
+
*,
|
|
573
|
+
parent_assignment_id: str | None,
|
|
574
|
+
failure_reason: str | None,
|
|
575
|
+
environmental: bool | None = None,
|
|
330
576
|
) -> None:
|
|
331
577
|
"""#1605: resolve a work row's ``test_state`` when its Test-stage
|
|
332
578
|
(``type="smoke"``) child dies without ever reporting pass/fail.
|
|
@@ -358,6 +604,17 @@ def propagate_smoke_terminal_failure(
|
|
|
358
604
|
completion already does (`coord/notify.py`'s completion handler), so
|
|
359
605
|
the existing bounded `coord fix` loop picks it up from there.
|
|
360
606
|
|
|
607
|
+
*environmental* (#2275) overrides that classification when the CALLER
|
|
608
|
+
already knows the answer. Default ``None`` means "classify from
|
|
609
|
+
*failure_reason*", i.e. every pre-#2275 caller is unchanged. Pass
|
|
610
|
+
``True`` only when the reason is coordinator-authored prose describing a
|
|
611
|
+
lost worker rather than a worker's own terminal output — the classifier's
|
|
612
|
+
vocabulary is deliberately restricted to named API/network wire tokens
|
|
613
|
+
(see :mod:`coord.failure_class`) and correctly defaults everything else to
|
|
614
|
+
WORK, so a call site that *knows* the machine ate the worker has to say
|
|
615
|
+
so rather than smuggle a token into its prose. The only such caller today
|
|
616
|
+
is :func:`_reconcile_no_agent_record`.
|
|
617
|
+
|
|
361
618
|
A no-op when *parent_assignment_id* is falsy (a smoke row somehow
|
|
362
619
|
missing its ``review_of_assignment_id`` — should not happen in practice,
|
|
363
620
|
but this must never raise on it).
|
|
@@ -365,16 +622,40 @@ def propagate_smoke_terminal_failure(
|
|
|
365
622
|
if not parent_assignment_id:
|
|
366
623
|
return
|
|
367
624
|
from coord.failure_class import classify_failure # noqa: PLC0415
|
|
368
|
-
from coord.
|
|
625
|
+
from coord.smoke import mute_smoke_legs, mute_smoke_tally # noqa: PLC0415
|
|
626
|
+
from coord.state import ( # noqa: PLC0415
|
|
627
|
+
load_assignment_test_reason,
|
|
628
|
+
record_test_verdict,
|
|
629
|
+
)
|
|
369
630
|
|
|
370
631
|
classification = classify_failure(failure_reason=failure_reason)
|
|
371
|
-
if
|
|
632
|
+
if environmental is None:
|
|
633
|
+
is_environmental = classification.is_environmental
|
|
634
|
+
cause = classification.reason
|
|
635
|
+
else:
|
|
636
|
+
is_environmental = bool(environmental)
|
|
637
|
+
cause = failure_reason or classification.reason
|
|
638
|
+
if is_environmental:
|
|
639
|
+
# #2272: this clear must CARRY the mute-leg tally, for exactly the
|
|
640
|
+
# reason `dispatch_smoke`'s `running` stamp must. `test_reason` is the
|
|
641
|
+
# only field that survives between Test-stage legs, so any writer that
|
|
642
|
+
# replaces it wholesale silently hands the row a fresh retry budget —
|
|
643
|
+
# and a row that alternates "mute leg" / "worker died environmentally"
|
|
644
|
+
# would then never reach the bound from either side. The tally is not
|
|
645
|
+
# incremented here (an environmental death is a different, genuinely
|
|
646
|
+
# self-healing cause and #1605's unbounded re-dispatch of it is
|
|
647
|
+
# deliberate) — it is only preserved, so mute legs keep counting
|
|
648
|
+
# across it.
|
|
649
|
+
carried = mute_smoke_legs(
|
|
650
|
+
load_assignment_test_reason(parent_assignment_id)
|
|
651
|
+
)
|
|
652
|
+
prefix = f"{mute_smoke_tally(carried)} — " if carried else ""
|
|
372
653
|
record_test_verdict(
|
|
373
654
|
assignment_id=parent_assignment_id,
|
|
374
655
|
test_state=None,
|
|
375
656
|
test_reason=(
|
|
376
|
-
"Test stage worker died environmentally "
|
|
377
|
-
f"({
|
|
657
|
+
f"{prefix}Test stage worker died environmentally "
|
|
658
|
+
f"({cause}) — cleared for automatic "
|
|
378
659
|
"re-dispatch, not recorded as a work failure (#1605)"
|
|
379
660
|
),
|
|
380
661
|
)
|