code-coordinator 0.5.97__tar.gz → 0.5.99__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.97 → code_coordinator-0.5.99}/PKG-INFO +1 -1
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/scm_file_list.json +2 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/block_log.py +213 -7
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/drive_queue.py +248 -5
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/service.py +128 -0
- code_coordinator-0.5.99/coord/queue_diagnose.py +956 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/reconcile.py +269 -6
- code_coordinator-0.5.99/tests/test_block_log.py +1227 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_drive_queue.py +410 -1
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_release_window.py +96 -3
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_service.py +112 -0
- code_coordinator-0.5.99/tests/test_reconcile_no_agent_record.py +538 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_thin_client_board_audit.py +10 -0
- code_coordinator-0.5.97/tests/test_block_log.py +0 -469
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.gitignore +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/CLAUDE.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/GOAL.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/LICENSE +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/MANIFEST.in +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/README.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/__init__.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agent.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/audit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/board_service.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/brain.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/claim.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/cli.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/client.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/comments.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/config.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dao.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/db.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deps.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/drive.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/events.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/filelock.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/freshness.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/gates.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/goal.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/context.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/models.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/render.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/units.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/hooks.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/interactive.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/models.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/network.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notify.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/openapi.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/parentage.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/plans.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/progress.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/release_window.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/reports.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/review.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/smoke.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/split_work.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/state.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/test_author.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/test_report.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/usage.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/install-agent.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/pyproject.toml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/setup.cfg +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/__init__.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/conftest.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_db.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_events.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_init.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_models.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_network.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_session.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_split.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_state.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -109,6 +109,7 @@ coord/portal_sync.py
|
|
|
109
109
|
coord/pr_body_lint.py
|
|
110
110
|
coord/prereqs.py
|
|
111
111
|
coord/progress.py
|
|
112
|
+
coord/queue_diagnose.py
|
|
112
113
|
coord/reconcile.py
|
|
113
114
|
coord/refine_chat.py
|
|
114
115
|
coord/release_cordon.py
|
|
@@ -674,6 +675,7 @@ tests/test_reap_stale_interactive_tick.py
|
|
|
674
675
|
tests/test_reconcile_branch.py
|
|
675
676
|
tests/test_reconcile_completions.py
|
|
676
677
|
tests/test_reconcile_merges.py
|
|
678
|
+
tests/test_reconcile_no_agent_record.py
|
|
677
679
|
tests/test_reconcile_usage_limit_done.py
|
|
678
680
|
tests/test_refine_chat.py
|
|
679
681
|
tests/test_release_cordon_2101.py
|
{code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -290,6 +290,7 @@
|
|
|
290
290
|
"coord/providers/claude.py",
|
|
291
291
|
"coord/providers/claude_pty.py",
|
|
292
292
|
"coord/providers/opencode.py",
|
|
293
|
+
"coord/queue_diagnose.py",
|
|
293
294
|
"coord/reconcile.py",
|
|
294
295
|
"coord/refine_chat.py",
|
|
295
296
|
"coord/release_cordon.py",
|
|
@@ -704,6 +705,7 @@
|
|
|
704
705
|
"tests/test_reconcile_branch.py",
|
|
705
706
|
"tests/test_reconcile_completions.py",
|
|
706
707
|
"tests/test_reconcile_merges.py",
|
|
708
|
+
"tests/test_reconcile_no_agent_record.py",
|
|
707
709
|
"tests/test_reconcile_usage_limit_done.py",
|
|
708
710
|
"tests/test_refine_chat.py",
|
|
709
711
|
"tests/test_release_cordon_2101.py",
|
|
@@ -16,12 +16,24 @@ So this module records, for every entry that reaches ``blocked`` or
|
|
|
16
16
|
Phase-0 read on its *true* cause — and
|
|
17
17
|
* whether a **human had to act** to get it out.
|
|
18
18
|
|
|
19
|
-
**What
|
|
20
|
-
call, re-derives no gate, and consults no live
|
|
21
|
-
already fetched for its own purposes.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
**What the RECORDER is emphatically NOT.** The writer above does not
|
|
20
|
+
diagnose. It runs no ``gh`` call, re-derives no gate, and consults no live
|
|
21
|
+
state that the tick has not already fetched for its own purposes.
|
|
22
|
+
|
|
23
|
+
**Phase 1 (#2276) fills the column Phase 0 cannot.** ``true_cause`` is empty
|
|
24
|
+
on every ``enter`` record — at that instant nobody knows it — and on ``exit``
|
|
25
|
+
it is derived from *the release the queue itself performed*, which is still
|
|
26
|
+
the queue talking about itself. #2235's finding is that the queue is wrong
|
|
27
|
+
about this five times out of seven. So :mod:`coord.queue_diagnose` re-derives
|
|
28
|
+
the cause from live state and appends a third record shape here,
|
|
29
|
+
:data:`EVENT_DIAGNOSIS`, which :func:`episodes` folds onto the open episode as
|
|
30
|
+
its ``true_cause``. That module owns the *deriving*; this one owns the
|
|
31
|
+
*record*, the pairing, and the honesty accounting — how often the derived
|
|
32
|
+
cause later agreed with how the episode actually resolved
|
|
33
|
+
(:func:`agreement_for`), reported as a rate rather than assumed
|
|
34
|
+
(:func:`summarize`). A diagnostician that is confidently wrong is worse than
|
|
35
|
+
one that abstains, which is why ``unknown`` is counted separately from
|
|
36
|
+
``disagreed`` and never folded into it.
|
|
25
37
|
|
|
26
38
|
**Recording must never change a decision.** Every public entry point here is
|
|
27
39
|
best-effort and swallows its own exceptions (:func:`record`), for the same
|
|
@@ -65,10 +77,17 @@ from coord.drive_queue import (
|
|
|
65
77
|
_log = logging.getLogger(__name__)
|
|
66
78
|
|
|
67
79
|
__all__ = [
|
|
80
|
+
"AGREEMENT_ABSTAINED",
|
|
81
|
+
"AGREEMENT_AGREED",
|
|
82
|
+
"AGREEMENT_DISAGREED",
|
|
83
|
+
"AGREEMENT_UNDECIDED",
|
|
84
|
+
"EVENT_DIAGNOSIS",
|
|
68
85
|
"EVENT_ENTER",
|
|
69
86
|
"EVENT_RESOLVE",
|
|
70
87
|
"STALL_STATES",
|
|
88
|
+
"agreement_for",
|
|
71
89
|
"block_log_path",
|
|
90
|
+
"diagnosis_event",
|
|
72
91
|
"enter_event",
|
|
73
92
|
"episodes",
|
|
74
93
|
"operator_resolution_event",
|
|
@@ -86,6 +105,13 @@ STALL_STATES: frozenset[str] = frozenset({STATE_BLOCKED, STATE_PARKED})
|
|
|
86
105
|
|
|
87
106
|
EVENT_ENTER = "enter"
|
|
88
107
|
EVENT_RESOLVE = "resolve"
|
|
108
|
+
#: #2276 Phase 1. A read-only re-derivation of an OPEN episode's cause, from
|
|
109
|
+
#: live state rather than from the queue's own stated reason. Appended to the
|
|
110
|
+
#: same file rather than a new store for the same reason `enter`/`resolve` are
|
|
111
|
+
#: two records and not one mutated row: the writer stays an O(1) append with
|
|
112
|
+
#: no read-modify-write race, and a later diagnosis that contradicts an earlier
|
|
113
|
+
#: one stays visible instead of overwriting it.
|
|
114
|
+
EVENT_DIAGNOSIS = "diagnosis"
|
|
89
115
|
|
|
90
116
|
# Rotate at 4 MiB — comfortably more than two weeks at this fleet's rate
|
|
91
117
|
# (single-digit stalls a night, ~400 bytes a record), and small enough that
|
|
@@ -444,6 +470,109 @@ def operator_resolution_event(
|
|
|
444
470
|
return record
|
|
445
471
|
|
|
446
472
|
|
|
473
|
+
# ── #2276 Phase 1: the diagnosis record, and scoring it ──────────────────────
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
def diagnosis_event(
|
|
477
|
+
*,
|
|
478
|
+
key: str,
|
|
479
|
+
state: str,
|
|
480
|
+
stated_reason: str,
|
|
481
|
+
true_cause: str,
|
|
482
|
+
cause: str,
|
|
483
|
+
confidence: str,
|
|
484
|
+
evidence: Sequence[str] = (),
|
|
485
|
+
contradicts_stated: bool = False,
|
|
486
|
+
trigger: str = "",
|
|
487
|
+
host: str = "",
|
|
488
|
+
now: float | None = None,
|
|
489
|
+
) -> dict[str, Any]:
|
|
490
|
+
"""A ``diagnosis`` record for one still-open stall.
|
|
491
|
+
|
|
492
|
+
Deliberately NOT a ``resolve``: the entry is still stalled, and a record
|
|
493
|
+
that closed the episode would make an observation look like an outcome —
|
|
494
|
+
which is the exact conflation (*a stated reason read as a cause*) this
|
|
495
|
+
whole plan exists to undo. :func:`episodes` folds it onto the open
|
|
496
|
+
episode instead, so ``coord drive-queue block-log`` shows a populated
|
|
497
|
+
``true_cause`` where it previously showed ``(unresolved)`` while the
|
|
498
|
+
episode itself stays open.
|
|
499
|
+
|
|
500
|
+
``human_acted`` is absent on purpose rather than ``False``: Phase 1 acts on
|
|
501
|
+
nothing and knows nothing about what a human did, and a ``False`` here
|
|
502
|
+
would be counted by :func:`summarize` as an auto-release that never
|
|
503
|
+
happened.
|
|
504
|
+
|
|
505
|
+
Every argument is a plain scalar so this module needs no import from
|
|
506
|
+
:mod:`coord.queue_diagnose` — the recorder must not depend on the thing it
|
|
507
|
+
records.
|
|
508
|
+
"""
|
|
509
|
+
return {
|
|
510
|
+
"event": EVENT_DIAGNOSIS,
|
|
511
|
+
"ts": time.time() if now is None else now,
|
|
512
|
+
"key": key,
|
|
513
|
+
"state": state,
|
|
514
|
+
# VERBATIM, same contract as `_enter_record`: the comparison between
|
|
515
|
+
# this and `true_cause` below IS the deliverable.
|
|
516
|
+
"stated_reason": stated_reason,
|
|
517
|
+
"true_cause": true_cause,
|
|
518
|
+
"cause": cause,
|
|
519
|
+
"confidence": confidence,
|
|
520
|
+
"evidence": [str(line) for line in evidence],
|
|
521
|
+
"contradicts_stated": bool(contradicts_stated),
|
|
522
|
+
"trigger": trigger,
|
|
523
|
+
"host": host,
|
|
524
|
+
"source": "diagnostician",
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
AGREEMENT_AGREED = "agreed"
|
|
529
|
+
AGREEMENT_DISAGREED = "disagreed"
|
|
530
|
+
#: The diagnosis said ``unknown``. A first-class verdict with NO penalty:
|
|
531
|
+
#: #2276 is explicit that a diagnostician which abstains is better than one
|
|
532
|
+
#: that guesses, so this is counted apart from `disagreed` and kept out of the
|
|
533
|
+
#: disagreement rate's denominator entirely.
|
|
534
|
+
AGREEMENT_ABSTAINED = "abstained"
|
|
535
|
+
#: The RESOLUTION is the unknown one. `operator-intervened` says in as many
|
|
536
|
+
#: words that what the human fixed is not recorded, so scoring a diagnosis
|
|
537
|
+
#: against it would be scoring it against noise.
|
|
538
|
+
AGREEMENT_UNDECIDED = "undecided"
|
|
539
|
+
|
|
540
|
+
#: ``resolve``-side cause slug -> the diagnosis causes that agree with it.
|
|
541
|
+
#: Keyed on the slug before the first " — ", the same split
|
|
542
|
+
#: :func:`summarize` buckets on. A resolution absent from this table is
|
|
543
|
+
#: undecidable, not a disagreement — see :data:`AGREEMENT_UNDECIDED`.
|
|
544
|
+
_AGREEING_CAUSES: dict[str, frozenset[str]] = {
|
|
545
|
+
"already-landed": frozenset({"pr-merged", "pr-closed"}),
|
|
546
|
+
"gate-cleared-after-giveup": frozenset(
|
|
547
|
+
{"nothing-blocking", "ci-green", "ci-pending"}
|
|
548
|
+
),
|
|
549
|
+
"ci-reported": frozenset({"nothing-blocking", "ci-green", "ci-pending"}),
|
|
550
|
+
"unrefreshable-reading": frozenset({"nothing-blocking", "ci-green", "no-pr"}),
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
def agreement_for(diagnosed_cause: str, resolution_cause: str) -> str:
|
|
555
|
+
"""Did Phase 1's derived cause match how the episode actually ended?
|
|
556
|
+
|
|
557
|
+
#2235's stated route to Phase 2 is *"run it read-only and check whether
|
|
558
|
+
its diagnosis matches what the human actually did"*, so this comparison
|
|
559
|
+
is a deliverable, not a follow-up. It is deliberately conservative in
|
|
560
|
+
both directions: an unrecognised resolution scores ``undecided`` rather
|
|
561
|
+
than being counted as a win, and an ``unknown`` diagnosis scores
|
|
562
|
+
``abstained`` rather than being counted as a loss.
|
|
563
|
+
"""
|
|
564
|
+
diagnosed = str(diagnosed_cause or "").split(" — ")[0]
|
|
565
|
+
resolved = str(resolution_cause or "").split(" — ")[0]
|
|
566
|
+
if not diagnosed:
|
|
567
|
+
return ""
|
|
568
|
+
if diagnosed == "unknown":
|
|
569
|
+
return AGREEMENT_ABSTAINED
|
|
570
|
+
agreeing = _AGREEING_CAUSES.get(resolved)
|
|
571
|
+
if agreeing is None:
|
|
572
|
+
return AGREEMENT_UNDECIDED
|
|
573
|
+
return AGREEMENT_AGREED if diagnosed in agreeing else AGREEMENT_DISAGREED
|
|
574
|
+
|
|
575
|
+
|
|
447
576
|
# ── persistence (best-effort, never raises) ──────────────────────────────────
|
|
448
577
|
|
|
449
578
|
|
|
@@ -543,6 +672,17 @@ def episodes(events: Sequence[Mapping[str, Any]]) -> list[dict[str, Any]]:
|
|
|
543
672
|
A ``resolve`` with no preceding ``enter`` (the log started mid-stall) is
|
|
544
673
|
dropped rather than synthesised: an episode whose stated reason is
|
|
545
674
|
unknown cannot answer the one question this log exists to answer.
|
|
675
|
+
|
|
676
|
+
A ``diagnosis`` (#2276 Phase 1) folds onto the open episode: it fills
|
|
677
|
+
``true_cause`` — the column Phase 0 leaves empty and ``summarize`` buckets
|
|
678
|
+
as ``(unresolved)`` — without closing the episode, because the entry is
|
|
679
|
+
still stalled. A diagnosis for a key with no open episode is dropped for
|
|
680
|
+
the same reason an orphan ``resolve`` is: there is nothing to attach it
|
|
681
|
+
to, and inventing the episode would fabricate a stated reason to compare
|
|
682
|
+
against. Once the episode resolves, ``true_cause`` reverts to the
|
|
683
|
+
resolution's own account of what happened and the derived one is kept
|
|
684
|
+
beside it as ``diagnosed_cause``, so ``agreement`` scores two independent
|
|
685
|
+
claims rather than one claim against itself.
|
|
546
686
|
"""
|
|
547
687
|
open_by_key: dict[str, dict[str, Any]] = {}
|
|
548
688
|
out: list[dict[str, Any]] = []
|
|
@@ -571,21 +711,54 @@ def episodes(events: Sequence[Mapping[str, Any]]) -> list[dict[str, Any]]:
|
|
|
571
711
|
"human_acted": None,
|
|
572
712
|
"resolved_at": None,
|
|
573
713
|
"stalled_seconds": None,
|
|
714
|
+
# #2276 Phase 1. `diagnoses` is what `needs_diagnosis` spends
|
|
715
|
+
# against the attempt budget, so it has to survive a restart —
|
|
716
|
+
# which it does, being recounted from the log every read
|
|
717
|
+
# rather than held in memory.
|
|
718
|
+
"diagnoses": 0,
|
|
719
|
+
"diagnosed_cause": "",
|
|
720
|
+
"diagnosis_confidence": "",
|
|
721
|
+
"diagnosis_evidence": [],
|
|
722
|
+
"diagnosis_contradicts_stated": False,
|
|
723
|
+
"agreement": "",
|
|
574
724
|
}
|
|
725
|
+
elif kind == EVENT_DIAGNOSIS:
|
|
726
|
+
episode = open_by_key.get(key)
|
|
727
|
+
if episode is None:
|
|
728
|
+
continue
|
|
729
|
+
cause = str(event.get("cause") or "")
|
|
730
|
+
episode.update(
|
|
731
|
+
{
|
|
732
|
+
"diagnoses": int(episode.get("diagnoses") or 0) + 1,
|
|
733
|
+
"diagnosed_cause": cause,
|
|
734
|
+
"diagnosis_confidence": str(event.get("confidence") or ""),
|
|
735
|
+
"diagnosis_evidence": list(event.get("evidence") or []),
|
|
736
|
+
"diagnosis_contradicts_stated": bool(
|
|
737
|
+
event.get("contradicts_stated")
|
|
738
|
+
),
|
|
739
|
+
# The whole point of the column: an OPEN episode now has a
|
|
740
|
+
# cause where it used to have "".
|
|
741
|
+
"true_cause": str(event.get("true_cause") or ""),
|
|
742
|
+
}
|
|
743
|
+
)
|
|
575
744
|
elif kind == EVENT_RESOLVE:
|
|
576
745
|
episode = open_by_key.pop(key, None)
|
|
577
746
|
if episode is None:
|
|
578
747
|
continue
|
|
579
748
|
resolved_at = float(event.get("ts") or 0.0)
|
|
749
|
+
resolution_cause = str(event.get("true_cause") or "")
|
|
580
750
|
episode.update(
|
|
581
751
|
{
|
|
582
752
|
"resolved": True,
|
|
583
753
|
"resolution": event.get("resolution", ""),
|
|
584
|
-
"true_cause":
|
|
754
|
+
"true_cause": resolution_cause,
|
|
585
755
|
"human_acted": bool(event.get("human_acted")),
|
|
586
756
|
"resolved_at": resolved_at,
|
|
587
757
|
"stalled_seconds": max(0.0, resolved_at - episode["entered_at"]),
|
|
588
758
|
"source": event.get("source", ""),
|
|
759
|
+
"agreement": agreement_for(
|
|
760
|
+
str(episode.get("diagnosed_cause") or ""), resolution_cause
|
|
761
|
+
),
|
|
589
762
|
}
|
|
590
763
|
)
|
|
591
764
|
out.append(episode)
|
|
@@ -608,6 +781,17 @@ def summarize(items: Sequence[Mapping[str, Any]]) -> dict[str, Any]:
|
|
|
608
781
|
than once. The issue's framing — *a repeat is a bug report, not a
|
|
609
782
|
success* — needs that count visible from day one, or the trend line has
|
|
610
783
|
nothing to be checked against.
|
|
784
|
+
|
|
785
|
+
``diagnosis`` is #2276's own success criterion, and it is reported as a
|
|
786
|
+
measurement rather than an assertion. ``disagreement_rate`` is
|
|
787
|
+
``disagreed / (agreed + disagreed)`` and is ``None`` — not ``0.0`` — when
|
|
788
|
+
nothing scorable has resolved yet, because a rate of zero out of zero
|
|
789
|
+
reads as a perfect record. ``abstained`` sits outside that fraction
|
|
790
|
+
entirely: #2276 makes ``unknown`` a first-class verdict with no penalty,
|
|
791
|
+
and putting it in the denominator would penalise it. ``contradicted``
|
|
792
|
+
counts the episodes where the live evidence positively ruled the queue's
|
|
793
|
+
stated reason out — the five-of-seven number, finally measured instead of
|
|
794
|
+
reconstructed by hand.
|
|
611
795
|
"""
|
|
612
796
|
by_state: dict[str, int] = {}
|
|
613
797
|
by_cause: dict[str, int] = {}
|
|
@@ -615,7 +799,17 @@ def summarize(items: Sequence[Mapping[str, Any]]) -> dict[str, Any]:
|
|
|
615
799
|
human = 0
|
|
616
800
|
auto = 0
|
|
617
801
|
still_open = 0
|
|
802
|
+
diagnosed = 0
|
|
803
|
+
contradicted = 0
|
|
804
|
+
agreement_counts: dict[str, int] = {}
|
|
618
805
|
for item in items:
|
|
806
|
+
if item.get("diagnosed_cause"):
|
|
807
|
+
diagnosed += 1
|
|
808
|
+
if item.get("diagnosis_contradicts_stated"):
|
|
809
|
+
contradicted += 1
|
|
810
|
+
verdict = str(item.get("agreement") or "")
|
|
811
|
+
if verdict:
|
|
812
|
+
agreement_counts[verdict] = agreement_counts.get(verdict, 0) + 1
|
|
619
813
|
state = str(item.get("state") or "?")
|
|
620
814
|
by_state[state] = by_state.get(state, 0) + 1
|
|
621
815
|
if not item.get("resolved"):
|
|
@@ -639,6 +833,9 @@ def summarize(items: Sequence[Mapping[str, Any]]) -> dict[str, Any]:
|
|
|
639
833
|
for (repo, stated), count in sorted(seen_pairs.items())
|
|
640
834
|
if count > 1
|
|
641
835
|
}
|
|
836
|
+
agreed = agreement_counts.get(AGREEMENT_AGREED, 0)
|
|
837
|
+
disagreed = agreement_counts.get(AGREEMENT_DISAGREED, 0)
|
|
838
|
+
scored = agreed + disagreed
|
|
642
839
|
return {
|
|
643
840
|
"episodes": len(items),
|
|
644
841
|
"by_state": by_state,
|
|
@@ -647,4 +844,13 @@ def summarize(items: Sequence[Mapping[str, Any]]) -> dict[str, Any]:
|
|
|
647
844
|
"auto_released": auto,
|
|
648
845
|
"open": still_open,
|
|
649
846
|
"repeat_causes": repeats,
|
|
847
|
+
"diagnosis": {
|
|
848
|
+
"diagnosed": diagnosed,
|
|
849
|
+
"contradicted_stated_reason": contradicted,
|
|
850
|
+
"agreed": agreed,
|
|
851
|
+
"disagreed": disagreed,
|
|
852
|
+
"abstained": agreement_counts.get(AGREEMENT_ABSTAINED, 0),
|
|
853
|
+
"undecided": agreement_counts.get(AGREEMENT_UNDECIDED, 0),
|
|
854
|
+
"disagreement_rate": (disagreed / scored) if scored else None,
|
|
855
|
+
},
|
|
650
856
|
}
|
|
@@ -928,7 +928,26 @@ def _episode_line(item: Mapping[str, Any]) -> str:
|
|
|
928
928
|
if len(stated) > 90:
|
|
929
929
|
stated = stated[:87] + "..."
|
|
930
930
|
if not item.get("resolved"):
|
|
931
|
-
|
|
931
|
+
line = f"{key:<28} {state:<8} STILL STALLED stated: {stated}"
|
|
932
|
+
# #2276 Phase 1. An open episode used to have nothing in the `cause`
|
|
933
|
+
# column at all — `summarize` bucketed it as `(unresolved)`. When the
|
|
934
|
+
# diagnostician has been round, it does, and the CONTRADICTS marker is
|
|
935
|
+
# what makes #2235's five-of-seven finding legible at a glance instead
|
|
936
|
+
# of requiring the reader to hold both strings in their head.
|
|
937
|
+
cause = " ".join(str(item.get("true_cause") or "").split())
|
|
938
|
+
if cause:
|
|
939
|
+
flag = (
|
|
940
|
+
" ← CONTRADICTS the stated reason"
|
|
941
|
+
if item.get("diagnosis_contradicts_stated")
|
|
942
|
+
else ""
|
|
943
|
+
)
|
|
944
|
+
confidence = str(item.get("diagnosis_confidence") or "?")
|
|
945
|
+
line += (
|
|
946
|
+
f"\n{'':<28} {'':<8} cause: {cause}"
|
|
947
|
+
f"\n{'':<28} {'':<8} "
|
|
948
|
+
f"(diagnosed, confidence {confidence}){flag}"
|
|
949
|
+
)
|
|
950
|
+
return line
|
|
932
951
|
mark = "HUMAN" if item.get("human_acted") else "auto "
|
|
933
952
|
held = item.get("stalled_seconds")
|
|
934
953
|
age = _age_str(float(held)) if held is not None else "?"
|
|
@@ -962,10 +981,15 @@ def drive_queue_block_log(output_json: bool, days: float, config_path: Path) ->
|
|
|
962
981
|
how often did a human have to act?" is answered from two weeks of evidence
|
|
963
982
|
rather than from one morning's triage.
|
|
964
983
|
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
984
|
+
This command itself does not diagnose — it renders what other passes
|
|
985
|
+
recorded. For a *resolved* episode, `cause` is still derived from the
|
|
986
|
+
release the queue itself performed (a #2230 gate-clear, a #1891 CI
|
|
987
|
+
resume, an operator's `remove`), never from a live re-check. For a
|
|
988
|
+
still-open episode, `cause` may instead be a Phase 1 (#2276) live
|
|
989
|
+
re-check's verdict — `coord drive-queue diagnose` or the notifier tick's
|
|
990
|
+
`diagnose_pass` recorded it as a `diagnosis` event, and `_episode_line`
|
|
991
|
+
renders it with a `(diagnosed, confidence ...)` tag so it reads distinct
|
|
992
|
+
from a resolution-derived cause.
|
|
969
993
|
|
|
970
994
|
Read the two summary numbers together: `human_acted` is the count #2235
|
|
971
995
|
wants to see fall, but a queue that stops needing interventions by leaving
|
|
@@ -1014,6 +1038,225 @@ def drive_queue_block_log(output_json: bool, days: float, config_path: Path) ->
|
|
|
1014
1038
|
stats["repeat_causes"].items(), key=lambda kv: (-kv[1], kv[0])
|
|
1015
1039
|
):
|
|
1016
1040
|
click.echo(f" {count}× {label}")
|
|
1041
|
+
for line in _diagnosis_summary_lines(stats.get("diagnosis") or {}):
|
|
1042
|
+
click.echo(line)
|
|
1043
|
+
|
|
1044
|
+
|
|
1045
|
+
def _diagnosis_summary_lines(diag: Mapping[str, Any]) -> list[str]:
|
|
1046
|
+
"""#2276's success criterion, rendered as a measurement.
|
|
1047
|
+
|
|
1048
|
+
The disagreement rate is printed as ``(not yet measurable)`` rather than
|
|
1049
|
+
``0%`` until something scorable has resolved, because #2276 is explicit
|
|
1050
|
+
that the number must be *measured, not assumed* — and "0% wrong out of
|
|
1051
|
+
nothing" is the most flattering way there is to assume it.
|
|
1052
|
+
"""
|
|
1053
|
+
if not diag.get("diagnosed"):
|
|
1054
|
+
return []
|
|
1055
|
+
lines = [
|
|
1056
|
+
f"diagnosed {diag['diagnosed']} stall(s) — "
|
|
1057
|
+
f"{diag.get('contradicted_stated_reason', 0)} contradicted the stated reason"
|
|
1058
|
+
]
|
|
1059
|
+
rate = diag.get("disagreement_rate")
|
|
1060
|
+
scored = f"{diag.get('agreed', 0)} agreed · {diag.get('disagreed', 0)} disagreed"
|
|
1061
|
+
tail = (
|
|
1062
|
+
f"{rate * 100:.0f}% disagreement"
|
|
1063
|
+
if rate is not None
|
|
1064
|
+
else "disagreement rate: (not yet measurable — nothing scorable has resolved)"
|
|
1065
|
+
)
|
|
1066
|
+
lines.append(f" vs. how they actually resolved: {scored} — {tail}")
|
|
1067
|
+
lines.append(
|
|
1068
|
+
f" {diag.get('abstained', 0)} abstained (said unknown, which is not a "
|
|
1069
|
+
f"failure) · {diag.get('undecided', 0)} unscorable"
|
|
1070
|
+
)
|
|
1071
|
+
return lines
|
|
1072
|
+
|
|
1073
|
+
|
|
1074
|
+
# ── diagnose (#2276 Phase 1) ─────────────────────────────────────────────────
|
|
1075
|
+
|
|
1076
|
+
|
|
1077
|
+
def _diagnosis_lines(diagnosis: Any) -> list[str]:
|
|
1078
|
+
"""One diagnosis, rendered. ``stated`` and ``cause`` adjacent, as ever."""
|
|
1079
|
+
flag = " ← CONTRADICTS the stated reason" if diagnosis.contradicts_stated else ""
|
|
1080
|
+
trigger = f" (triggered by: {diagnosis.trigger})" if diagnosis.trigger else ""
|
|
1081
|
+
lines = [
|
|
1082
|
+
f"{diagnosis.key} [{diagnosis.state}]{trigger}",
|
|
1083
|
+
f" stated: {' '.join((diagnosis.stated_reason or '(none)').split())}",
|
|
1084
|
+
f" cause: {diagnosis.cause} (confidence {diagnosis.confidence}){flag}",
|
|
1085
|
+
]
|
|
1086
|
+
if diagnosis.abstained:
|
|
1087
|
+
lines.append(
|
|
1088
|
+
" unknown is a verdict, not a failure — the evidence "
|
|
1089
|
+
"below was too thin to name a cause"
|
|
1090
|
+
)
|
|
1091
|
+
lines.append(" evidence:")
|
|
1092
|
+
lines.extend(f" - {line}" for line in diagnosis.evidence)
|
|
1093
|
+
return lines
|
|
1094
|
+
|
|
1095
|
+
|
|
1096
|
+
@drive_queue_group.command("diagnose")
|
|
1097
|
+
@click.option("--json", "output_json", is_flag=True, default=False, help="Emit diagnoses as JSON.")
|
|
1098
|
+
@click.option(
|
|
1099
|
+
"--dry-run",
|
|
1100
|
+
is_flag=True,
|
|
1101
|
+
default=False,
|
|
1102
|
+
help="Derive and print, but do not append the diagnosis to the block log.",
|
|
1103
|
+
)
|
|
1104
|
+
@_CONFIG_OPTION
|
|
1105
|
+
def drive_queue_diagnose(output_json: bool, dry_run: bool, config_path: Path) -> None:
|
|
1106
|
+
"""Re-derive the REAL blocker of every still-stalled entry (#2276 Phase 1).
|
|
1107
|
+
|
|
1108
|
+
Read-only. It runs no `coord merge`, dispatches nothing, and writes nothing
|
|
1109
|
+
to the board or the queue — its single output is a `diagnosis` record in
|
|
1110
|
+
the Phase-0 block log, which no decision path reads.
|
|
1111
|
+
|
|
1112
|
+
The queue's stated reason is an INPUT TO BE CONTRADICTED, never a starting
|
|
1113
|
+
hypothesis: #2235 found that five of seven overnight stalls named a symptom
|
|
1114
|
+
rather than a cause, so this asks GitHub, the live gate report and the
|
|
1115
|
+
agent's /health what is actually true right now, and only then checks
|
|
1116
|
+
whether the evidence still supports what the queue said.
|
|
1117
|
+
|
|
1118
|
+
`unknown` is a first-class verdict. Thin evidence gets an abstention, not a
|
|
1119
|
+
guess — a confidently wrong cause is worse than no cause, because #2268's
|
|
1120
|
+
Phase 2 would inherit the confidence.
|
|
1121
|
+
|
|
1122
|
+
It runs here, and in `coord serve`'s notifier tick, rather than as a
|
|
1123
|
+
dispatched worker: a diagnosis needs `gh`, and `gh` is denied to workers
|
|
1124
|
+
(#1483). The trigger in the daemon is #1632's own stall detector — there is
|
|
1125
|
+
deliberately no second definition of "stalled" anywhere in this path.
|
|
1126
|
+
|
|
1127
|
+
That notifier-tick trigger only fires when `notifications.enabled` is
|
|
1128
|
+
true (`coord.notifier.service._tick` returns before `diagnose_pass` runs
|
|
1129
|
+
otherwise) — notifications are off by default in this repo, so on a
|
|
1130
|
+
fleet that has not turned them on, THIS command is the only live entry
|
|
1131
|
+
point into Phase 1.
|
|
1132
|
+
"""
|
|
1133
|
+
from coord import block_log, queue_diagnose # noqa: PLC0415
|
|
1134
|
+
from coord.board_service import is_remote # noqa: PLC0415
|
|
1135
|
+
from coord.commands._common import _load_config # noqa: PLC0415
|
|
1136
|
+
|
|
1137
|
+
# #615/#906 guard: everything this command reads — the Phase-0 block log,
|
|
1138
|
+
# the queue rows, the board handed to GhLiveProbe — lives on the daemon
|
|
1139
|
+
# host, and the probes need `gh` (denied to workers, #1483). On a thin
|
|
1140
|
+
# client all three reads would be silently empty, so the "diagnosis"
|
|
1141
|
+
# would be a confident report about a queue that isn't there. Fail loud
|
|
1142
|
+
# instead (the exact #615 failure mode this audit exists to prevent).
|
|
1143
|
+
if is_remote():
|
|
1144
|
+
raise click.ClickException(
|
|
1145
|
+
"drive-queue diagnose reads the daemon host's block log, queue "
|
|
1146
|
+
"and board directly — run it there (a board_service-configured "
|
|
1147
|
+
"thin client would diagnose an empty queue)."
|
|
1148
|
+
)
|
|
1149
|
+
|
|
1150
|
+
from coord.drive import list_drive_sessions # noqa: PLC0415
|
|
1151
|
+
from coord.health.aggregate import local_fleet_health_block # noqa: PLC0415
|
|
1152
|
+
from coord.state import build_board, list_drive_queue # noqa: PLC0415
|
|
1153
|
+
|
|
1154
|
+
config = _load_config(config_path)
|
|
1155
|
+
episodes = [
|
|
1156
|
+
ep for ep in block_log.episodes(block_log.read_events()) if not ep.get("resolved")
|
|
1157
|
+
]
|
|
1158
|
+
entries = entries_from_rows(list_drive_queue())
|
|
1159
|
+
# #2276 review: without these two, `GhLiveProbe._health()` short-circuits
|
|
1160
|
+
# to `(None, None, [])` for every entry — `agent_reachable` and
|
|
1161
|
+
# `agent_has_session` are permanently unknown, which makes `dead-leg` and
|
|
1162
|
+
# `agent-unreachable` structurally unreachable verdicts from this command.
|
|
1163
|
+
# Same local-DB read `coord status` uses in host mode (status.py's own
|
|
1164
|
+
# `local_fleet_health_block` call) — no fresh /health round trip, just
|
|
1165
|
+
# the last tick's reported state; and the same `list_drive_sessions()`
|
|
1166
|
+
# this file already calls elsewhere (`_fetch_board_view`) for live tmux
|
|
1167
|
+
# session names.
|
|
1168
|
+
fleet_health = local_fleet_health_block([m.name for m in config.machines])
|
|
1169
|
+
live_sessions = frozenset(
|
|
1170
|
+
str(row["session_name"])
|
|
1171
|
+
for row in list_drive_sessions()
|
|
1172
|
+
if row.get("session_name")
|
|
1173
|
+
)
|
|
1174
|
+
probe = queue_diagnose.GhLiveProbe(
|
|
1175
|
+
config=config,
|
|
1176
|
+
board=build_board(),
|
|
1177
|
+
fleet_health=fleet_health,
|
|
1178
|
+
live_sessions=live_sessions,
|
|
1179
|
+
# #1870: that `list_drive_sessions()` above is a LOCAL tmux read, so
|
|
1180
|
+
# the probe has to know whose tmux it is. Without this an entry some
|
|
1181
|
+
# OTHER machine launched reads as "session absent" here and lands a
|
|
1182
|
+
# high-confidence `dead-leg` on a session that is very much alive —
|
|
1183
|
+
# the same trap `_reconcile_running` already sidesteps.
|
|
1184
|
+
local_host=_local_host_id(),
|
|
1185
|
+
)
|
|
1186
|
+
# `keys=None` — an operator asking directly wants every open episode
|
|
1187
|
+
# looked at, not just the ones the notifier happens to have raised this
|
|
1188
|
+
# minute. `limit=None` for the same reason, and because the per-pass cap
|
|
1189
|
+
# exists to protect `coord serve`'s 30 s tick, which this is not on: a cap
|
|
1190
|
+
# here would silently diagnose four of ten and print "4 diagnosed", which
|
|
1191
|
+
# reads as "that was all of them". The per-episode budget still applies,
|
|
1192
|
+
# so this cannot become a way to spend `gh` calls in a loop.
|
|
1193
|
+
diagnoses = queue_diagnose.run_pass(
|
|
1194
|
+
entries, episodes, probe=probe, keys=None, limit=None
|
|
1195
|
+
)
|
|
1196
|
+
|
|
1197
|
+
if diagnoses and not dry_run:
|
|
1198
|
+
_record_block_log(
|
|
1199
|
+
[
|
|
1200
|
+
block_log.diagnosis_event(
|
|
1201
|
+
key=d.key,
|
|
1202
|
+
state=d.state,
|
|
1203
|
+
stated_reason=d.stated_reason,
|
|
1204
|
+
true_cause=d.true_cause,
|
|
1205
|
+
cause=d.cause,
|
|
1206
|
+
confidence=d.confidence,
|
|
1207
|
+
evidence=d.evidence,
|
|
1208
|
+
contradicts_stated=d.contradicts_stated,
|
|
1209
|
+
trigger=d.trigger,
|
|
1210
|
+
host=_local_host_id(),
|
|
1211
|
+
)
|
|
1212
|
+
for d in diagnoses
|
|
1213
|
+
]
|
|
1214
|
+
)
|
|
1215
|
+
|
|
1216
|
+
if output_json:
|
|
1217
|
+
click.echo(
|
|
1218
|
+
_json.dumps(
|
|
1219
|
+
{
|
|
1220
|
+
"recorded": bool(diagnoses) and not dry_run,
|
|
1221
|
+
"diagnoses": [
|
|
1222
|
+
{
|
|
1223
|
+
"key": d.key,
|
|
1224
|
+
"state": d.state,
|
|
1225
|
+
"stated_reason": d.stated_reason,
|
|
1226
|
+
"cause": d.cause,
|
|
1227
|
+
"true_cause": d.true_cause,
|
|
1228
|
+
"confidence": d.confidence,
|
|
1229
|
+
"evidence": list(d.evidence),
|
|
1230
|
+
"contradicts_stated": d.contradicts_stated,
|
|
1231
|
+
"trigger": d.trigger,
|
|
1232
|
+
}
|
|
1233
|
+
for d in diagnoses
|
|
1234
|
+
],
|
|
1235
|
+
}
|
|
1236
|
+
)
|
|
1237
|
+
)
|
|
1238
|
+
return
|
|
1239
|
+
|
|
1240
|
+
if not diagnoses:
|
|
1241
|
+
click.echo(
|
|
1242
|
+
"nothing to diagnose: no open stall episode is both unexplained and "
|
|
1243
|
+
"still within its diagnosis budget"
|
|
1244
|
+
)
|
|
1245
|
+
return
|
|
1246
|
+
for diagnosis in diagnoses:
|
|
1247
|
+
for line in _diagnosis_lines(diagnosis):
|
|
1248
|
+
click.echo(line)
|
|
1249
|
+
click.echo("")
|
|
1250
|
+
contradicted = sum(1 for d in diagnoses if d.contradicts_stated)
|
|
1251
|
+
abstained = sum(1 for d in diagnoses if d.abstained)
|
|
1252
|
+
click.echo(
|
|
1253
|
+
f"{len(diagnoses)} diagnosed — {contradicted} contradicted the stated "
|
|
1254
|
+
f"reason · {abstained} abstained (unknown)"
|
|
1255
|
+
)
|
|
1256
|
+
click.echo(
|
|
1257
|
+
"nothing was mutated; read the outcome later with "
|
|
1258
|
+
"`coord drive-queue block-log`"
|
|
1259
|
+
)
|
|
1017
1260
|
|
|
1018
1261
|
|
|
1019
1262
|
# ── overlap-report (#2247) ───────────────────────────────────────────────────
|