code-coordinator 0.5.98__tar.gz → 0.5.100__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.98 → code_coordinator-0.5.100}/PKG-INFO +1 -1
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/block_log.py +213 -7
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/drive_queue.py +248 -5
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/drive.py +50 -3
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notifier/service.py +128 -0
- code_coordinator-0.5.100/coord/queue_diagnose.py +956 -0
- code_coordinator-0.5.100/tests/test_block_log.py +1227 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_drive_queue.py +410 -1
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_release_window.py +96 -3
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_drive.py +78 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notifier_service.py +112 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_thin_client_board_audit.py +10 -0
- code_coordinator-0.5.98/tests/test_block_log.py +0 -469
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/.gitignore +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/CLAUDE.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/GOAL.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/LICENSE +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/MANIFEST.in +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/README.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/__init__.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/agent.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/audit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/board_service.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/brain.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/claim.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/cli.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/client.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/comments.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/config.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dao.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/db.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/deps.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/events.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/filelock.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/freshness.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/gates.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/goal.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/context.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/models.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/render.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/health/units.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/hooks.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/interactive.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/models.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/network.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/notify.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/openapi.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/parentage.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/plans.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/progress.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/release_window.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/reports.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/review.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/smoke.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/split_work.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/state.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/test_author.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/test_report.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/usage.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/install-agent.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/pyproject.toml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/setup.cfg +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/__init__.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/conftest.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_config.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_db.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_events.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_init.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_models.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_network.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_review.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_session.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_split.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_state.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.98 → code_coordinator-0.5.100}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -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) ───────────────────────────────────────────────────
|