code-coordinator 0.5.96__tar.gz → 0.5.97__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.97}/PKG-INFO +1 -1
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dead_end.py +36 -7
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notify.py +52 -17
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/reconcile.py +20 -2
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/smoke.py +163 -3
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/stage_projection.py +10 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dead_end.py +38 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notify.py +289 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_smoke.py +234 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.gitignore +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/CLAUDE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/GOAL.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/LICENSE +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/MANIFEST.in +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/README.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agent.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/block_log.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/board_service.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/brain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/claim.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/client.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/comments.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/config.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dao.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/db.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deps.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/drive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/events.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/filelock.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/freshness.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/gates.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/goal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/context.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/models.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/render.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/units.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/hooks.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/interactive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/models.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/network.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/openapi.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/parentage.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/plans.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/progress.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/release_window.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/reports.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/review.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/split_work.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/test_author.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/test_report.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/usage.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/install-agent.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/pyproject.toml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/setup.cfg +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/__init__.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/conftest.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_db.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_events.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_init.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_models.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_network.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_session.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_split.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_state.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -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
|
|
|
@@ -365,15 +365,33 @@ def propagate_smoke_terminal_failure(
|
|
|
365
365
|
if not parent_assignment_id:
|
|
366
366
|
return
|
|
367
367
|
from coord.failure_class import classify_failure # noqa: PLC0415
|
|
368
|
-
from coord.
|
|
368
|
+
from coord.smoke import mute_smoke_legs, mute_smoke_tally # noqa: PLC0415
|
|
369
|
+
from coord.state import ( # noqa: PLC0415
|
|
370
|
+
load_assignment_test_reason,
|
|
371
|
+
record_test_verdict,
|
|
372
|
+
)
|
|
369
373
|
|
|
370
374
|
classification = classify_failure(failure_reason=failure_reason)
|
|
371
375
|
if classification.is_environmental:
|
|
376
|
+
# #2272: this clear must CARRY the mute-leg tally, for exactly the
|
|
377
|
+
# reason `dispatch_smoke`'s `running` stamp must. `test_reason` is the
|
|
378
|
+
# only field that survives between Test-stage legs, so any writer that
|
|
379
|
+
# replaces it wholesale silently hands the row a fresh retry budget —
|
|
380
|
+
# and a row that alternates "mute leg" / "worker died environmentally"
|
|
381
|
+
# would then never reach the bound from either side. The tally is not
|
|
382
|
+
# incremented here (an environmental death is a different, genuinely
|
|
383
|
+
# self-healing cause and #1605's unbounded re-dispatch of it is
|
|
384
|
+
# deliberate) — it is only preserved, so mute legs keep counting
|
|
385
|
+
# across it.
|
|
386
|
+
carried = mute_smoke_legs(
|
|
387
|
+
load_assignment_test_reason(parent_assignment_id)
|
|
388
|
+
)
|
|
389
|
+
prefix = f"{mute_smoke_tally(carried)} — " if carried else ""
|
|
372
390
|
record_test_verdict(
|
|
373
391
|
assignment_id=parent_assignment_id,
|
|
374
392
|
test_state=None,
|
|
375
393
|
test_reason=(
|
|
376
|
-
"Test stage worker died environmentally "
|
|
394
|
+
f"{prefix}Test stage worker died environmentally "
|
|
377
395
|
f"({classification.reason}) — cleared for automatic "
|
|
378
396
|
"re-dispatch, not recorded as a work failure (#1605)"
|
|
379
397
|
),
|
|
@@ -46,6 +46,7 @@ from __future__ import annotations
|
|
|
46
46
|
|
|
47
47
|
import json
|
|
48
48
|
import logging
|
|
49
|
+
import re
|
|
49
50
|
import time
|
|
50
51
|
import uuid
|
|
51
52
|
from dataclasses import dataclass
|
|
@@ -102,6 +103,21 @@ session — the coordinator sees exit 0 either way, so a run whose suite failed
|
|
|
102
103
|
and whose marker is missing is recorded as NO verdict (never a pass) and the \
|
|
103
104
|
Test stage has to be re-run. Exit with the matching code as well, for the \
|
|
104
105
|
non-headless lanes that do read it.
|
|
106
|
+
- NEVER END YOUR TURN WITH THE SUITE STILL RUNNING (#2272). Your smoke \
|
|
107
|
+
command can easily exceed the ~600s Bash ceiling; when it does, the harness \
|
|
108
|
+
moves it to the BACKGROUND and hands you a task id instead of an exit status. \
|
|
109
|
+
That is not a result — it is "no answer yet". Narrating that you kicked the \
|
|
110
|
+
suite off and stopping there prints no marker, so the Test stage records NO \
|
|
111
|
+
verdict and re-dispatches; because the ceiling is deterministic, every \
|
|
112
|
+
re-dispatch does exactly the same thing, which is why this loop bills \
|
|
113
|
+
indefinitely. Instead: POLL the backgrounded task to completion from THIS \
|
|
114
|
+
same session, in bounded steps (`BashOutput`/`TaskOutput` with the id, or \
|
|
115
|
+
`Monitor`), and read its REAL exit status before you report anything. Do NOT \
|
|
116
|
+
use a foreground `until ! pgrep ...; do sleep ...; done` wait — it hits the \
|
|
117
|
+
identical 600s wall. If you genuinely cannot obtain an exit status before you \
|
|
118
|
+
run out of room, print `SMOKE: fail <the smoke command never returned an exit \
|
|
119
|
+
status within this session>` rather than ending mute: a stated verdict is \
|
|
120
|
+
recoverable, silence is not.
|
|
105
121
|
|
|
106
122
|
Where you are:
|
|
107
123
|
- You are in a dedicated git worktree created for this run. Every git command \
|
|
@@ -114,7 +130,10 @@ fail (#1694).
|
|
|
114
130
|
Steps:
|
|
115
131
|
1. `git fetch origin && git checkout <branch>` (the branch is in your \
|
|
116
132
|
briefing) — in your worktree, never in the base checkout.
|
|
117
|
-
2. Run the smoke command from the briefing. Capture stdout/stderr.
|
|
133
|
+
2. Run the smoke command from the briefing. Capture stdout/stderr. If the \
|
|
134
|
+
harness backgrounds it for exceeding the 600s Bash ceiling, poll that task to \
|
|
135
|
+
completion and use ITS exit status below — "I started it" is not an outcome \
|
|
136
|
+
(#2272).
|
|
118
137
|
3. If it exits 0 → print `SMOKE: pass` and exit 0.
|
|
119
138
|
4. If it exits {RUNNER_BASELINE_RED_EXIT} AND its output contains a line \
|
|
120
139
|
starting with literal text `{BASELINE_RED_OUTPUT_MARKER}` (#2170) — the smoke \
|
|
@@ -524,6 +543,33 @@ def build_smoke_briefing(
|
|
|
524
543
|
lines.append(smoke_command)
|
|
525
544
|
lines.append("```")
|
|
526
545
|
lines.append("")
|
|
546
|
+
# #2272: the ceiling is the deterministic cause of a mute Test stage. A
|
|
547
|
+
# suite this size routinely runs past 600s, the harness backgrounds it,
|
|
548
|
+
# and an agent that narrates "I kicked it off" and stops prints no marker
|
|
549
|
+
# — so the stage records NO verdict and re-dispatches, forever, at ~$0.12
|
|
550
|
+
# a lap. Say it in the briefing as well as the system prompt: the briefing
|
|
551
|
+
# is what the worker re-reads while it is deciding what to do next.
|
|
552
|
+
lines.append("## If the suite runs past the 600s Bash ceiling (#2272)")
|
|
553
|
+
lines.append("")
|
|
554
|
+
lines.append(
|
|
555
|
+
"Claude Code moves any Bash call past ~600s to the **background** and "
|
|
556
|
+
"hands you a task id instead of an exit status. That is not a result. "
|
|
557
|
+
"**Do not end your turn there** — poll the backgrounded task to "
|
|
558
|
+
"completion from this same session (`BashOutput`/`TaskOutput` with "
|
|
559
|
+
"the id, in bounded steps) and read its real exit status before "
|
|
560
|
+
"reporting. A foreground `until ! pgrep ...; do sleep ...; done` wait "
|
|
561
|
+
"hits the identical wall, so don't."
|
|
562
|
+
)
|
|
563
|
+
lines.append("")
|
|
564
|
+
lines.append(
|
|
565
|
+
"A turn that ends with the suite still running prints no marker, the "
|
|
566
|
+
"Test stage records NO verdict, and it re-dispatches — and since the "
|
|
567
|
+
"ceiling is deterministic, every re-dispatch stalls identically. If "
|
|
568
|
+
"you truly cannot get an exit status, print `SMOKE: fail <the smoke "
|
|
569
|
+
"command never returned an exit status within this session>` rather "
|
|
570
|
+
"than ending mute."
|
|
571
|
+
)
|
|
572
|
+
lines.append("")
|
|
527
573
|
lines.append(
|
|
528
574
|
"## Reporting the verdict (#2244)"
|
|
529
575
|
)
|
|
@@ -619,6 +665,91 @@ def _fetch_touched_files(repo_github: str, branch: str) -> list[str]:
|
|
|
619
665
|
TEST_STATE_BLOCKED = "blocked"
|
|
620
666
|
|
|
621
667
|
|
|
668
|
+
# ── Mute Test-stage legs: the retry budget (#2244/#2272) ────────────────────
|
|
669
|
+
#
|
|
670
|
+
# A Test-stage leg that finishes without printing a `SMOKE:` marker records NO
|
|
671
|
+
# verdict — never a pass (#2244). That is the right call, and it assumes
|
|
672
|
+
# re-running is USEFUL. #2272 is the case where it is not: on 2026-08-15 five
|
|
673
|
+
# consecutive legs against one work row each ran the suite past Claude Code's
|
|
674
|
+
# 600s Bash ceiling, got backgrounded, and ended mute. Deterministic cause,
|
|
675
|
+
# identical every lap, ~$0.12 and ~10 minutes each, and the board showed a
|
|
676
|
+
# healthy `running` Test stage throughout. It was stopped by hand.
|
|
677
|
+
#
|
|
678
|
+
# #2244 already intended a bound — "a SECOND mute run parks the row" — but it
|
|
679
|
+
# stored the evidence in the parent's `test_reason` and `dispatch_smoke`'s own
|
|
680
|
+
# `running` stamp overwrote that field on the very next dispatch. The counter
|
|
681
|
+
# was reset by the retry it was supposed to be counting, so the bound never
|
|
682
|
+
# fired. Hence two things here rather than one:
|
|
683
|
+
#
|
|
684
|
+
# * a TALLY that is explicit and parseable (`no-verdict (#2244) x2`) rather
|
|
685
|
+
# than a bare marker whose presence is the whole signal, and
|
|
686
|
+
# * `dispatch_smoke` carrying that tally ACROSS its `running` stamp, so the
|
|
687
|
+
# count survives the thing that kept destroying it.
|
|
688
|
+
#
|
|
689
|
+
# The generalisation matters more than the ceiling: whatever future cause
|
|
690
|
+
# leaves a Test stage mute — a dead harness, a machine that reboots mid-run, a
|
|
691
|
+
# prompt regression — it now costs a bounded number of legs and then names
|
|
692
|
+
# itself on the row, instead of billing forever. A cause the system cannot
|
|
693
|
+
# diagnose must still be a cause the system stops paying for.
|
|
694
|
+
|
|
695
|
+
#: The marker left in the parent work row's ``test_reason`` when a headless
|
|
696
|
+
#: Test stage produced no parseable verdict. Suffixed with `` xN`` from the
|
|
697
|
+
#: second leg on (see :func:`mute_smoke_tally`).
|
|
698
|
+
NO_SMOKE_VERDICT_MARKER = "no-verdict (#2244)"
|
|
699
|
+
|
|
700
|
+
#: How many CONSECUTIVE mute Test-stage legs one work row may burn before the
|
|
701
|
+
#: row is parked terminally instead of re-dispatched (#2272). Two — one lap of
|
|
702
|
+
#: genuine self-heal (the #1605 environmental-death shape really does clear on
|
|
703
|
+
#: a retry), then stop. Pinned by test: raising it raises the unattended spend
|
|
704
|
+
#: ceiling for every no-verdict cause at once, which is exactly the decision
|
|
705
|
+
#: that should be deliberate.
|
|
706
|
+
MUTE_SMOKE_LEG_BUDGET = 2
|
|
707
|
+
|
|
708
|
+
#: Matches the marker with or without its `` xN`` tally, so a reason written by
|
|
709
|
+
#: a pre-#2272 coordinator (bare marker, no count) still reads back as one leg
|
|
710
|
+
#: rather than zero — an upgrade mid-loop must not hand the row a fresh budget.
|
|
711
|
+
_MUTE_TALLY_RE = re.compile(
|
|
712
|
+
re.escape(NO_SMOKE_VERDICT_MARKER) + r"(?:\s*x\s*(\d+))?", re.IGNORECASE
|
|
713
|
+
)
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
def mute_smoke_legs(test_reason: str | None) -> int:
|
|
717
|
+
"""How many mute Test-stage legs *test_reason* records (0 if none).
|
|
718
|
+
|
|
719
|
+
Reads the tally back out of the parent work row's ``test_reason`` — the
|
|
720
|
+
one field that survives from one Test-stage leg to the next. Tolerates:
|
|
721
|
+
|
|
722
|
+
* ``None``/empty — no legs (the ordinary first dispatch),
|
|
723
|
+
* the bare pre-#2272 marker with no count — one leg,
|
|
724
|
+
* a truncated ``test_reason`` — the ``/board`` wire carries only a bounded
|
|
725
|
+
preview (:func:`coord.state.load_assignment_test_reason`), so the tally
|
|
726
|
+
is written at the FRONT of the reason where a preview still shows it.
|
|
727
|
+
"""
|
|
728
|
+
if not test_reason:
|
|
729
|
+
return 0
|
|
730
|
+
match = _MUTE_TALLY_RE.search(test_reason)
|
|
731
|
+
if match is None:
|
|
732
|
+
return 0
|
|
733
|
+
raw = match.group(1)
|
|
734
|
+
if raw is None:
|
|
735
|
+
return 1
|
|
736
|
+
try:
|
|
737
|
+
return max(1, int(raw))
|
|
738
|
+
except ValueError: # pragma: no cover — regex only matches digits
|
|
739
|
+
return 1
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
def mute_smoke_tally(count: int) -> str:
|
|
743
|
+
"""The marker for *count* mute legs — ``"no-verdict (#2244) x2"``.
|
|
744
|
+
|
|
745
|
+
A single leg renders as the bare marker, so an operator reading a row
|
|
746
|
+
mid-loop sees a count only once there is a count worth seeing.
|
|
747
|
+
"""
|
|
748
|
+
if count <= 1:
|
|
749
|
+
return NO_SMOKE_VERDICT_MARKER
|
|
750
|
+
return f"{NO_SMOKE_VERDICT_MARKER} x{count}"
|
|
751
|
+
|
|
752
|
+
|
|
622
753
|
#: Soft (transient) unroutable reports already logged this process, keyed by
|
|
623
754
|
#: ``(assignment_id, message)``. Transient conditions — a machine that is
|
|
624
755
|
#: merely unreachable right now — are left re-dispatchable so the stage
|
|
@@ -1095,17 +1226,46 @@ def dispatch_smoke(
|
|
|
1095
1226
|
# `running` → the merge never fires → repeat. Dispatching a *fresh* run
|
|
1096
1227
|
# must never, by itself, retract the previous answer; the new verdict
|
|
1097
1228
|
# replaces the old one when it actually lands.
|
|
1229
|
+
#
|
|
1230
|
+
# #2272: ...and this stamp must CARRY THE MUTE-LEG TALLY FORWARD. That is
|
|
1231
|
+
# the whole bug behind the five-lap loop: `test_reason` is the only field
|
|
1232
|
+
# that survives between Test-stage legs, `_record_smoke_verdict` stores the
|
|
1233
|
+
# "this leg came back mute" evidence there, and this write used to replace
|
|
1234
|
+
# it with a flat literal. So the counter was erased by the very retry it
|
|
1235
|
+
# existed to count, `already_mute_once` read False forever, and #2244's
|
|
1236
|
+
# "a second mute run parks the row" bound could never fire. Re-reading and
|
|
1237
|
+
# re-stating the tally here also keeps the retry VISIBLE on the board:
|
|
1238
|
+
# before this, a row on its fifth mute lap rendered identically to one
|
|
1239
|
+
# whose Test stage had just started for the first time, which is why five
|
|
1240
|
+
# identical laps looked like progress.
|
|
1098
1241
|
if completed.assignment_id is not None and completed.test_state not in (
|
|
1099
1242
|
"passed", "skipped", "failed",
|
|
1100
1243
|
):
|
|
1101
|
-
from coord.state import record_test_verdict
|
|
1244
|
+
from coord.state import load_assignment_test_reason, record_test_verdict
|
|
1245
|
+
|
|
1246
|
+
# Belt and braces: the authoritative single-row read, falling back to
|
|
1247
|
+
# the board-carried value when it is unavailable (thin client, remote
|
|
1248
|
+
# read failure). Both are bounded previews at worst and the tally is
|
|
1249
|
+
# written at the front of the reason, so either still carries it.
|
|
1250
|
+
prior_legs = max(
|
|
1251
|
+
mute_smoke_legs(load_assignment_test_reason(completed.assignment_id)),
|
|
1252
|
+
mute_smoke_legs(getattr(completed, "test_reason", None)),
|
|
1253
|
+
)
|
|
1254
|
+
running_reason = "dispatched: Test stage running (#1426)"
|
|
1255
|
+
if prior_legs:
|
|
1256
|
+
running_reason = (
|
|
1257
|
+
f"{mute_smoke_tally(prior_legs)} — {running_reason}; "
|
|
1258
|
+
f"retry {prior_legs + 1} of {MUTE_SMOKE_LEG_BUDGET} after "
|
|
1259
|
+
f"{prior_legs} Test-stage leg(s) produced no verdict (#2272)"
|
|
1260
|
+
)
|
|
1102
1261
|
|
|
1103
1262
|
record_test_verdict(
|
|
1104
1263
|
assignment_id=completed.assignment_id,
|
|
1105
1264
|
test_state="running",
|
|
1106
|
-
test_reason=
|
|
1265
|
+
test_reason=running_reason,
|
|
1107
1266
|
)
|
|
1108
1267
|
completed.test_state = "running"
|
|
1268
|
+
completed.test_reason = running_reason
|
|
1109
1269
|
|
|
1110
1270
|
return smoke_assignment
|
|
1111
1271
|
|
|
@@ -276,6 +276,16 @@ def test_stage_status_for(
|
|
|
276
276
|
# blocked reason reaches the operator through `test_reason` instead —
|
|
277
277
|
# rendered by `coord gates` and, since no smoke row exists in this case,
|
|
278
278
|
# by the TUI Summary tab's `board_assignment_reason` on the work row.
|
|
279
|
+
#
|
|
280
|
+
# #2272 parks the same ``"blocked"`` for a second cause — N Test-stage
|
|
281
|
+
# legs finished without printing a `SMOKE:` marker and the retry budget
|
|
282
|
+
# ran out — and it maps here for the identical reason: a mute leg says
|
|
283
|
+
# nothing about the branch, so FAILED would be a lie about the diff and
|
|
284
|
+
# would offer the operator a Work re-dispatch that fixes nothing. The
|
|
285
|
+
# count and the cause travel in `test_reason` (`coord.smoke.
|
|
286
|
+
# mute_smoke_legs` reads them back), which is what keeps a row on its
|
|
287
|
+
# last retry distinguishable from one whose Test stage never started —
|
|
288
|
+
# the confusion that let five identical mute laps look like progress.
|
|
279
289
|
return PENDING
|
|
280
290
|
|
|
281
291
|
|
|
@@ -261,6 +261,44 @@ def test_a_blocked_test_stage_is_a_dead_end() -> None:
|
|
|
261
261
|
assert found.recovery == (
|
|
262
262
|
f"coord diagnose {REPO} {ISSUE} --stage test --reset"
|
|
263
263
|
)
|
|
264
|
+
# The #1672 cause, stated as the #1672 cause.
|
|
265
|
+
assert "no capability-matched" in found.reason
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def test_a_mute_exhausted_test_stage_names_its_own_cause() -> None:
|
|
269
|
+
"""#2272: the mute-leg budget parks the SAME ``blocked`` value as #1672's
|
|
270
|
+
unroutable stage — both mean "no verdict is coming" — but the recovery is
|
|
271
|
+
completely different, so they must not share a reason.
|
|
272
|
+
|
|
273
|
+
Telling an operator "no capability-matched machine could run the suite"
|
|
274
|
+
about a row whose machines were healthy all along is the symptom-not-cause
|
|
275
|
+
failure #2235 exists to measure: the real answer is "N legs went mute,
|
|
276
|
+
almost certainly the 600s Bash ceiling".
|
|
277
|
+
"""
|
|
278
|
+
from coord.smoke import mute_smoke_tally # noqa: PLC0415
|
|
279
|
+
|
|
280
|
+
found = detect_dead_end(
|
|
281
|
+
state(
|
|
282
|
+
work_aid="w2272",
|
|
283
|
+
work_status="done",
|
|
284
|
+
work_branch="issue-2272",
|
|
285
|
+
work_test_state=TEST_STATE_BLOCKED,
|
|
286
|
+
work_test_reason=(
|
|
287
|
+
f"{mute_smoke_tally(2)}: the Test-stage worker 9214dcb25204 "
|
|
288
|
+
"ended without printing a verdict marker line. 2 smoke legs "
|
|
289
|
+
"produced no verdict."
|
|
290
|
+
),
|
|
291
|
+
active_count=0,
|
|
292
|
+
)
|
|
293
|
+
)
|
|
294
|
+
assert found is not None
|
|
295
|
+
assert found.kind == "test_stage_blocked"
|
|
296
|
+
assert "2 Test-stage leg(s)" in found.reason
|
|
297
|
+
assert "600s Bash ceiling" in found.reason
|
|
298
|
+
# It must NOT misattribute this to the fleet — the machines were fine.
|
|
299
|
+
assert "no capability-matched" not in found.reason
|
|
300
|
+
# And it must not read as a statement about the branch.
|
|
301
|
+
assert "Nothing is known to be wrong with the BRANCH" in found.reason
|
|
264
302
|
|
|
265
303
|
|
|
266
304
|
def test_gates_carry_the_readings_that_proved_the_dead_end() -> None:
|