code-coordinator 0.5.80__tar.gz → 0.5.81__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.80 → code_coordinator-0.5.81}/PKG-INFO +1 -1
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agent.py +86 -9
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/graph_health.py +13 -1
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/providers/opencode.py +13 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/repo_onboard.py +38 -1
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/worker_events.py +225 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/GRAPHIFY_SETUP.md +44 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent.py +144 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_graph_health.py +37 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_providers.py +41 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_repo_onboard_2220.py +23 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worker_events.py +239 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.gitignore +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/CLAUDE.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/GOAL.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/LICENSE +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/MANIFEST.in +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/README.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/__init__.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/audit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/board_service.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/brain.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/claim.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/cli.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/client.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/comments.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/config.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dao.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/db.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deps.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/drive.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/events.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/filelock.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/freshness.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/gates.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/goal.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/context.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/models.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/render.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/units.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/hooks.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/interactive.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/models.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/network.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notify.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/openapi.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/parentage.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/plans.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/progress.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/release_window.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/reports.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/review.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/smoke.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/split_work.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/state.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/test_author.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/test_report.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/usage.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/install-agent.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/pyproject.toml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/setup.cfg +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/__init__.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/conftest.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_config.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_db.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_events.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_init.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_models.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_network.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_session.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_split.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_state.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -756,13 +756,11 @@ def _graphify_update(repo_path: Path, *, timeout: float = 600.0) -> tuple[bool,
|
|
|
756
756
|
# across N consecutive legs means the prompt instruction isn't landing.
|
|
757
757
|
# Deliberately NOT a DB column: this is a cheap, best-effort signal, not a
|
|
758
758
|
# gate anything blocks on, so it stays out of the Assignment schema/migrations.
|
|
759
|
-
#
|
|
760
|
-
#
|
|
761
|
-
#
|
|
762
|
-
#
|
|
763
|
-
#
|
|
764
|
-
# undercount to 0 (#2212 review).
|
|
765
|
-
_GRAPHIFY_INVOCATION_RE = re.compile(r"(?:^|[\n;&|]\s*)graphify(?:\s|$)")
|
|
759
|
+
# #2236: the pattern itself now lives in `coord.worker_events`, which grew a
|
|
760
|
+
# need for it when the summary parser started recording each query's OUTCOME
|
|
761
|
+
# and not just the count. Imported lazily (like every other
|
|
762
|
+
# `coord.worker_events` use in this module) rather than duplicated, so the two
|
|
763
|
+
# halves of the measurement can never drift apart on what counts as a query.
|
|
766
764
|
|
|
767
765
|
|
|
768
766
|
def _count_graphify_invocations(bash_commands: list[str]) -> int:
|
|
@@ -781,7 +779,68 @@ def _count_graphify_invocations(bash_commands: list[str]) -> int:
|
|
|
781
779
|
b"`` counts once, not twice. Treat the result as an "at least one graph
|
|
782
780
|
query this leg" signal, not an exact invocation tally.
|
|
783
781
|
"""
|
|
784
|
-
|
|
782
|
+
from coord.worker_events import is_graphify_command # noqa: PLC0415
|
|
783
|
+
|
|
784
|
+
return sum(1 for cmd in bash_commands if is_graphify_command(cmd))
|
|
785
|
+
|
|
786
|
+
|
|
787
|
+
def _worktree_graph_present(
|
|
788
|
+
worktree_path: str | None, repo_path_fallback: str | None = None
|
|
789
|
+
) -> bool:
|
|
790
|
+
"""True iff the worker's checkout has a **resolvable** ``graphify-out/graph.json``.
|
|
791
|
+
|
|
792
|
+
#2236: ``graphify_invocations=0`` is ambiguous on its own. Two of five
|
|
793
|
+
repos ship no graph and no ``.githooks/post-checkout``, so their worktrees
|
|
794
|
+
get an empty ``graphify-out/`` — and the worker prompt's own escape hatch
|
|
795
|
+
("no graph? skip straight to grep, silently") then fires correctly and
|
|
796
|
+
says nothing. Those workers were *obeying* the rule, not ignoring it, and
|
|
797
|
+
the counter cannot tell them apart from a worker that had a graph and
|
|
798
|
+
never asked. Recording this alongside the count is what disambiguates.
|
|
799
|
+
|
|
800
|
+
*repo_path_fallback* mirrors the branch-capture logic a few hundred
|
|
801
|
+
lines up in ``_reap`` ("for legacy assignments (no worktree_path) we
|
|
802
|
+
fall back to the main repo clone"): a legacy/non-worktree assignment has
|
|
803
|
+
no ``worktree_path`` at all, but its worker still ran against
|
|
804
|
+
``spec.repo_path`` directly, which may have a perfectly good graph.
|
|
805
|
+
Without this fallback, every legacy assignment logs ``graph_present=0``
|
|
806
|
+
regardless — conflating "no worktree" with "no graph".
|
|
807
|
+
|
|
808
|
+
``exists()`` follows symlinks deliberately: a linked worktree's
|
|
809
|
+
``graph.json`` is a symlink into the base checkout (see
|
|
810
|
+
``coord/graph_health.py``), and a *dangling* symlink is exactly as
|
|
811
|
+
graph-blind as no file at all — so both must read as absent.
|
|
812
|
+
"""
|
|
813
|
+
path = worktree_path or repo_path_fallback
|
|
814
|
+
if not path:
|
|
815
|
+
return False
|
|
816
|
+
try:
|
|
817
|
+
return (Path(path) / "graphify-out" / "graph.json").exists()
|
|
818
|
+
except OSError:
|
|
819
|
+
return False
|
|
820
|
+
|
|
821
|
+
|
|
822
|
+
def _format_graphify_query_lines(queries: Iterable[Any]) -> list[str]:
|
|
823
|
+
"""Render per-query ``# graphify_query …`` log lines (#2236).
|
|
824
|
+
|
|
825
|
+
``graphify_invocations=N`` counts attempts but cannot distinguish
|
|
826
|
+
"queried and got a useful answer" from "queried, got nothing, fell back to
|
|
827
|
+
grep" — and those imply opposite fixes (a habit problem the prompt can
|
|
828
|
+
move, vs. a graph coverage/quality problem no amount of prompting helps).
|
|
829
|
+
One line per query, ``grep``-able on ``outcome=``, with the command text
|
|
830
|
+
last because it is the only free-form field.
|
|
831
|
+
"""
|
|
832
|
+
lines: list[str] = []
|
|
833
|
+
for q in queries:
|
|
834
|
+
results = getattr(q, "results", None)
|
|
835
|
+
# `worker_events._truncate` already newline-strips and trims this
|
|
836
|
+
# when the `GraphifyQuery` entry is built — no need to redo it here.
|
|
837
|
+
command = str(getattr(q, "command", ""))
|
|
838
|
+
lines.append(
|
|
839
|
+
f"# graphify_query: outcome={getattr(q, 'outcome', 'unknown')} "
|
|
840
|
+
f"results={results if results is not None else '?'} "
|
|
841
|
+
f"cmd={command!r}\n"
|
|
842
|
+
)
|
|
843
|
+
return lines
|
|
785
844
|
|
|
786
845
|
|
|
787
846
|
def _infer_repo_github_slug(repo_path: str) -> str | None:
|
|
@@ -7511,9 +7570,27 @@ class AgentServer:
|
|
|
7511
7570
|
_graphify_invocations = _count_graphify_invocations(
|
|
7512
7571
|
_worker_summary.bash_commands if _worker_summary is not None else []
|
|
7513
7572
|
)
|
|
7573
|
+
# #2236: the count alone can't separate "didn't try" from
|
|
7574
|
+
# "couldn't try" (no graph in this worktree — the prompt's own
|
|
7575
|
+
# escape hatch fires silently) or from "tried, got nothing".
|
|
7576
|
+
# `graph_present` answers the first; the per-query lines below
|
|
7577
|
+
# answer the second. Read while the worktree still exists —
|
|
7578
|
+
# `_cleanup_worktree` runs further down this same function.
|
|
7579
|
+
_graph_present = _worktree_graph_present(
|
|
7580
|
+
getattr(assignment, "worktree_path", None) if assignment else None,
|
|
7581
|
+
getattr(assignment.spec, "repo_path", None) if assignment else None,
|
|
7582
|
+
)
|
|
7514
7583
|
reopen.write(
|
|
7515
7584
|
f"# reap: done (exit_code={exit_code} status={final_status} "
|
|
7516
|
-
f"graphify_invocations={_graphify_invocations}
|
|
7585
|
+
f"graphify_invocations={_graphify_invocations} "
|
|
7586
|
+
f"graph_present={int(_graph_present)})\n"
|
|
7587
|
+
)
|
|
7588
|
+
reopen.writelines(
|
|
7589
|
+
_format_graphify_query_lines(
|
|
7590
|
+
_worker_summary.graphify_queries
|
|
7591
|
+
if _worker_summary is not None
|
|
7592
|
+
else []
|
|
7593
|
+
)
|
|
7517
7594
|
)
|
|
7518
7595
|
except (OSError, AttributeError):
|
|
7519
7596
|
pass
|
|
@@ -280,6 +280,18 @@ def graph_status(repo_path: Path, default_branch: str = "main") -> GraphStatus:
|
|
|
280
280
|
return st
|
|
281
281
|
|
|
282
282
|
|
|
283
|
+
def hooks_file_present(repo_path: Path) -> bool:
|
|
284
|
+
"""Does this repo TRACK ``.githooks/post-checkout`` at all?
|
|
285
|
+
|
|
286
|
+
Split out of :func:`hooks_path_status` (#2236) so callers that only need
|
|
287
|
+
"does the repo ship the hook file" — as opposed to the full
|
|
288
|
+
``core.hooksPath`` configuration story — have one place to ask, instead
|
|
289
|
+
of independently re-running the same ``.is_file()`` check (a split-brain
|
|
290
|
+
the two would otherwise be one edit away from disagreeing on).
|
|
291
|
+
"""
|
|
292
|
+
return (repo_path / HOOKS_PATH / "post-checkout").is_file()
|
|
293
|
+
|
|
294
|
+
|
|
283
295
|
def hooks_path_status(repo_path: Path) -> tuple[bool, str]:
|
|
284
296
|
"""``(ok, detail)`` for this checkout's ``core.hooksPath``.
|
|
285
297
|
|
|
@@ -298,7 +310,7 @@ def hooks_path_status(repo_path: Path) -> tuple[bool, str]:
|
|
|
298
310
|
except (subprocess.SubprocessError, OSError) as exc:
|
|
299
311
|
return False, f"could not read core.hooksPath ({exc})"
|
|
300
312
|
value = r.stdout.strip()
|
|
301
|
-
have_hook = (repo_path
|
|
313
|
+
have_hook = hooks_file_present(repo_path)
|
|
302
314
|
if not value:
|
|
303
315
|
if not have_hook:
|
|
304
316
|
# The repo doesn't ship the bootstrap at all — telling the operator
|
|
@@ -830,6 +830,19 @@ def _update_opencode_summary(summary: WorkerSummary, data: dict) -> None:
|
|
|
830
830
|
cmd = tool_input.get("command")
|
|
831
831
|
if isinstance(cmd, str) and cmd:
|
|
832
832
|
summary.bash_commands.append(cmd)
|
|
833
|
+
# #2236: same graph-usage instrumentation the claude parser
|
|
834
|
+
# does. opencode carries the call and its output in one event,
|
|
835
|
+
# so the outcome settles here instead of on a later
|
|
836
|
+
# `tool_result`.
|
|
837
|
+
from coord.worker_events import record_graphify_call # noqa: PLC0415
|
|
838
|
+
|
|
839
|
+
_out = state.get("output")
|
|
840
|
+
record_graphify_call(
|
|
841
|
+
summary,
|
|
842
|
+
cmd,
|
|
843
|
+
output=_out if isinstance(_out, str) else None,
|
|
844
|
+
is_error=state.get("status") == "error",
|
|
845
|
+
)
|
|
833
846
|
elif tool in ("edit", "write"):
|
|
834
847
|
fp = tool_input.get("filePath")
|
|
835
848
|
if isinstance(fp, str) and fp:
|
|
@@ -144,6 +144,16 @@ class GraphFacts:
|
|
|
144
144
|
detail: str | None = None
|
|
145
145
|
hooks_installed: bool = False
|
|
146
146
|
hooks_detail: str | None = None
|
|
147
|
+
# #2236: does the repo TRACK `.githooks/post-checkout` at all? Two
|
|
148
|
+
# distinct failures hide behind `hooks_installed=False`, and they take
|
|
149
|
+
# opposite fixes: a repo that ships the hook but hasn't pointed
|
|
150
|
+
# `core.hooksPath` at it needs one `git config`; a repo that never ported
|
|
151
|
+
# the hook (coord-portal, stick-demo) needs the files first — running
|
|
152
|
+
# `git config core.hooksPath .githooks` there points git at a directory
|
|
153
|
+
# that does not exist, which silently disables ALL hooks for that
|
|
154
|
+
# checkout. Telling an operator the wrong one is worse than saying
|
|
155
|
+
# nothing, so the fix line has to know which it is.
|
|
156
|
+
hooks_shipped: bool = False
|
|
147
157
|
|
|
148
158
|
|
|
149
159
|
@dataclass
|
|
@@ -326,6 +336,13 @@ def gather_graph_facts(repo_path: Path | None, default_branch: str = "main") ->
|
|
|
326
336
|
ok, detail = False, f"hooks probe failed: {exc}"
|
|
327
337
|
facts.hooks_installed = bool(ok)
|
|
328
338
|
facts.hooks_detail = detail
|
|
339
|
+
try:
|
|
340
|
+
# Same question `hooks_path_status` already answers internally —
|
|
341
|
+
# consume its `hooks_file_present` helper rather than re-running the
|
|
342
|
+
# `.is_file()` check independently (#2236 review: split-brain risk).
|
|
343
|
+
facts.hooks_shipped = graph_health.hooks_file_present(repo_path)
|
|
344
|
+
except OSError:
|
|
345
|
+
facts.hooks_shipped = False
|
|
329
346
|
return facts
|
|
330
347
|
|
|
331
348
|
|
|
@@ -882,7 +899,27 @@ def evaluate_graph(facts: RepoFacts) -> list[Finding]:
|
|
|
882
899
|
summary="graph artifact is current with HEAD",
|
|
883
900
|
))
|
|
884
901
|
|
|
885
|
-
if not g.hooks_installed:
|
|
902
|
+
if not g.hooks_installed and not g.hooks_shipped:
|
|
903
|
+
# #2236: the repo never ported the hook. `git config core.hooksPath
|
|
904
|
+
# .githooks` here would point git at a directory that does not exist
|
|
905
|
+
# and disable every hook in the checkout, so the fix is to bring the
|
|
906
|
+
# files over FIRST — worktrees of this repo get no linked graph until
|
|
907
|
+
# then, however the machine is configured.
|
|
908
|
+
out.append(Finding(
|
|
909
|
+
layer="graph", check="graph.hooks_not_ported", severity=WARN,
|
|
910
|
+
summary=(
|
|
911
|
+
f"this repo ships no .githooks/post-checkout — "
|
|
912
|
+
f"{g.hooks_detail or 'the worktree graph bootstrap does not exist here'}; "
|
|
913
|
+
"worktrees get no linked graph, so every worker on this repo "
|
|
914
|
+
"silently falls back to grep"
|
|
915
|
+
),
|
|
916
|
+
fix=(
|
|
917
|
+
"port .githooks/ (_lib.sh, post-checkout, post-commit, post-merge) "
|
|
918
|
+
"from claude-coordinator into this repo, THEN "
|
|
919
|
+
"git config core.hooksPath .githooks (see docs/GRAPHIFY_SETUP.md)"
|
|
920
|
+
),
|
|
921
|
+
))
|
|
922
|
+
elif not g.hooks_installed:
|
|
886
923
|
out.append(Finding(
|
|
887
924
|
layer="graph", check="graph.hooks_missing", severity=WARN,
|
|
888
925
|
summary=(
|
|
@@ -44,6 +44,110 @@ class WorkerEvent:
|
|
|
44
44
|
return {"type": self.type, "subtype": self.subtype, "raw": self.raw}
|
|
45
45
|
|
|
46
46
|
|
|
47
|
+
# #2212/#2236: recognise a `graphify` CLI call inside a Bash command string.
|
|
48
|
+
# Separators recognized before the command token: `;`, `&`, `|` (covers `&&`
|
|
49
|
+
# and `||` too, since `\s*` after the class soaks up the second char) and a
|
|
50
|
+
# bare newline — Claude Code's Bash tool very commonly emits multi-line
|
|
51
|
+
# command strings (e.g. `cd repo\ngraphify query "foo"`) that aren't joined
|
|
52
|
+
# with `;`/`&&`, so newline must count as a separator or those legs
|
|
53
|
+
# undercount to 0 (#2212 review). Anchoring on a separator is what keeps a
|
|
54
|
+
# path mention (`cat graphify-out/graph.json`) from counting as a query.
|
|
55
|
+
# Canonical home is here rather than in coord/agent.py (#2236) because the
|
|
56
|
+
# summary parser now needs it too — agent.py imports this symbol.
|
|
57
|
+
GRAPHIFY_INVOCATION_RE = re.compile(r"(?:^|[\n;&|]\s*)graphify(?:\s|$)")
|
|
58
|
+
|
|
59
|
+
# Longest command text kept per query. The point is to tell one query apart
|
|
60
|
+
# from another when reading logs, not to replay it — a multi-KB heredoc in the
|
|
61
|
+
# same Bash call would otherwise bloat every reap line.
|
|
62
|
+
_GRAPHIFY_CMD_MAX = 200
|
|
63
|
+
|
|
64
|
+
# graphify query prints a `… | 81 nodes found` traversal header; when the
|
|
65
|
+
# header is absent (other subcommands, older builds) we fall back to counting
|
|
66
|
+
# result rows, which are line-prefixed with the record kind.
|
|
67
|
+
_GRAPHIFY_COUNT_RE = re.compile(r"(\d+)\s+(?:nodes?|results?|matches?)\s+found", re.I)
|
|
68
|
+
_GRAPHIFY_ROW_RE = re.compile(r"^(?:NODE|EDGE|PATH|COMMUNITY)\b", re.M)
|
|
69
|
+
|
|
70
|
+
# graphify's real zero-match phrasing: `graphify query` prints the literal
|
|
71
|
+
# "No matching nodes found." (graphify/serve.py:435, vs. the "{N} nodes
|
|
72
|
+
# found" header on a hit, graphify/serve.py:445) and `graphify affected`
|
|
73
|
+
# prints "No affected nodes found." (graphify/affected.py:132). Neither has a
|
|
74
|
+
# leading digit, so `_GRAPHIFY_COUNT_RE` never matches it, and neither is
|
|
75
|
+
# NODE/EDGE/PATH/COMMUNITY-prefixed, so `_GRAPHIFY_ROW_RE` doesn't either —
|
|
76
|
+
# without this, a real "ran the query, graph doesn't cover that" result fell
|
|
77
|
+
# through to `None` ("unknown") instead of `0` ("empty"), which is precisely
|
|
78
|
+
# the "tried and got nothing must not look like never tried" case #2236
|
|
79
|
+
# exists to fix.
|
|
80
|
+
_GRAPHIFY_EMPTY_RE = re.compile(r"No (?:matching|affected) \w+ found\.?", re.I)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def is_graphify_command(cmd: str | None) -> bool:
|
|
84
|
+
"""True iff *cmd* invokes the ``graphify`` CLI as a command token."""
|
|
85
|
+
return bool(cmd) and bool(GRAPHIFY_INVOCATION_RE.search(cmd or ""))
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def graphify_result_count(output: str | None) -> int | None:
|
|
89
|
+
"""Best-effort "how many results did this graphify call return".
|
|
90
|
+
|
|
91
|
+
Reads the ``N nodes found`` traversal header graphify prints first; falls
|
|
92
|
+
back to counting ``NODE``/``EDGE``/``PATH``/``COMMUNITY`` result rows,
|
|
93
|
+
then to graphify's literal "No matching/affected ... found." zero-match
|
|
94
|
+
phrasing, and then to "0 for empty output". Returns ``None`` when the
|
|
95
|
+
output has content but no recognisable result shape (e.g. ``graphify
|
|
96
|
+
update .``, whose output is a build log) — ``None`` means "not
|
|
97
|
+
countable", which is deliberately distinct from ``0`` ("ran, returned
|
|
98
|
+
nothing"), because the whole point of #2236 is to tell *tried and got
|
|
99
|
+
nothing* apart from *didn't try*.
|
|
100
|
+
"""
|
|
101
|
+
if output is None:
|
|
102
|
+
return None
|
|
103
|
+
if not output.strip():
|
|
104
|
+
return 0
|
|
105
|
+
m = _GRAPHIFY_COUNT_RE.search(output)
|
|
106
|
+
if m:
|
|
107
|
+
try:
|
|
108
|
+
return int(m.group(1))
|
|
109
|
+
except ValueError: # pragma: no cover - regex guarantees digits
|
|
110
|
+
return None
|
|
111
|
+
rows = len(_GRAPHIFY_ROW_RE.findall(output))
|
|
112
|
+
if rows:
|
|
113
|
+
return rows
|
|
114
|
+
if _GRAPHIFY_EMPTY_RE.search(output):
|
|
115
|
+
return 0
|
|
116
|
+
return None
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
@dataclass
|
|
120
|
+
class GraphifyQuery:
|
|
121
|
+
"""One ``graphify`` invocation by a worker, and what it returned (#2236).
|
|
122
|
+
|
|
123
|
+
``graphify_invocations=N`` (#2212) counts attempts, which cannot separate
|
|
124
|
+
"queried and got a useful answer" from "queried, got nothing, fell back to
|
|
125
|
+
grep" — and those two imply opposite fixes (habit vs. graph coverage). So
|
|
126
|
+
each call is recorded with its command text and the outcome of its tool
|
|
127
|
+
result.
|
|
128
|
+
|
|
129
|
+
``outcome`` is one of:
|
|
130
|
+
|
|
131
|
+
* ``"hit"`` — returned at least one countable result.
|
|
132
|
+
* ``"empty"`` — ran fine and returned nothing (graph coverage problem).
|
|
133
|
+
* ``"error"`` — the tool result was flagged as an error (e.g. no graph
|
|
134
|
+
built here, graphify not installed).
|
|
135
|
+
* ``"unknown"`` — no result was correlated (log truncated to a tail, or
|
|
136
|
+
output shape not countable, e.g. ``graphify update .``).
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
command: str
|
|
140
|
+
outcome: str = "unknown"
|
|
141
|
+
results: int | None = None
|
|
142
|
+
|
|
143
|
+
def to_dict(self) -> dict:
|
|
144
|
+
return {
|
|
145
|
+
"command": self.command,
|
|
146
|
+
"outcome": self.outcome,
|
|
147
|
+
"results": self.results,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
|
|
47
151
|
@dataclass
|
|
48
152
|
class WorkerSummary:
|
|
49
153
|
"""Rolling summary built from a stream of WorkerEvents."""
|
|
@@ -60,6 +164,13 @@ class WorkerSummary:
|
|
|
60
164
|
last_tool: str | None = None
|
|
61
165
|
files_edited: list[str] = field(default_factory=list)
|
|
62
166
|
bash_commands: list[str] = field(default_factory=list)
|
|
167
|
+
# #2236: one entry per `graphify` invocation, with the outcome of its tool
|
|
168
|
+
# result folded in when the log carries one. See :class:`GraphifyQuery`.
|
|
169
|
+
graphify_queries: list[GraphifyQuery] = field(default_factory=list)
|
|
170
|
+
# tool_use_id -> index into `graphify_queries`, so a later `tool_result`
|
|
171
|
+
# can be attributed back to the call that produced it. Internal bookkeeping
|
|
172
|
+
# for `update_summary`'s fold; deliberately excluded from `to_dict`.
|
|
173
|
+
pending_graphify: dict[str, int] = field(default_factory=dict, repr=False)
|
|
63
174
|
duration_ms: int | None = None
|
|
64
175
|
# Token counts from the result event (may be zero if the log predates
|
|
65
176
|
# token reporting or the worker didn't emit usage data).
|
|
@@ -96,6 +207,7 @@ class WorkerSummary:
|
|
|
96
207
|
"last_tool": self.last_tool,
|
|
97
208
|
"files_edited": list(self.files_edited),
|
|
98
209
|
"bash_commands": list(self.bash_commands),
|
|
210
|
+
"graphify_queries": [q.to_dict() for q in self.graphify_queries],
|
|
99
211
|
"duration_ms": self.duration_ms,
|
|
100
212
|
"input_tokens": self.input_tokens,
|
|
101
213
|
"output_tokens": self.output_tokens,
|
|
@@ -495,6 +607,87 @@ def _assistant_text(event: WorkerEvent) -> str:
|
|
|
495
607
|
# ── Streaming summary update ───────────────────────────────────────────────
|
|
496
608
|
|
|
497
609
|
|
|
610
|
+
def record_graphify_call(
|
|
611
|
+
summary: WorkerSummary,
|
|
612
|
+
cmd: str | None,
|
|
613
|
+
*,
|
|
614
|
+
tool_use_id: object = None,
|
|
615
|
+
output: str | None = None,
|
|
616
|
+
is_error: bool = False,
|
|
617
|
+
) -> None:
|
|
618
|
+
"""Record a graphify shell call on *summary*, if *cmd* is one (#2236).
|
|
619
|
+
|
|
620
|
+
Providers whose log carries the call and its output in one event (e.g.
|
|
621
|
+
opencode) pass ``output``/``is_error`` and the outcome is settled
|
|
622
|
+
immediately. Claude's stream-json splits the two across a ``tool_use``
|
|
623
|
+
block and a later ``tool_result``, so it passes ``tool_use_id`` instead
|
|
624
|
+
and the outcome is filled in by :func:`_resolve_graphify_result`. A call
|
|
625
|
+
with neither stays ``outcome="unknown"``, which is the honest reading: we
|
|
626
|
+
saw the attempt and never saw what came back.
|
|
627
|
+
"""
|
|
628
|
+
if not is_graphify_command(cmd):
|
|
629
|
+
return
|
|
630
|
+
entry = GraphifyQuery(command=_truncate(cmd or "", _GRAPHIFY_CMD_MAX))
|
|
631
|
+
summary.graphify_queries.append(entry)
|
|
632
|
+
if output is not None or is_error:
|
|
633
|
+
_apply_graphify_outcome(entry, output, is_error)
|
|
634
|
+
return
|
|
635
|
+
if isinstance(tool_use_id, str) and tool_use_id:
|
|
636
|
+
summary.pending_graphify[tool_use_id] = len(summary.graphify_queries) - 1
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
def _apply_graphify_outcome(
|
|
640
|
+
entry: GraphifyQuery, output: str | None, is_error: bool
|
|
641
|
+
) -> None:
|
|
642
|
+
if is_error:
|
|
643
|
+
entry.outcome = "error"
|
|
644
|
+
return
|
|
645
|
+
count = graphify_result_count(output)
|
|
646
|
+
entry.results = count
|
|
647
|
+
entry.outcome = "unknown" if count is None else ("hit" if count > 0 else "empty")
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
def _resolve_graphify_result(
|
|
651
|
+
summary: WorkerSummary, tool_use_id: object, output: str | None, is_error: bool
|
|
652
|
+
) -> None:
|
|
653
|
+
"""Attribute a tool result back to the graphify call that issued it."""
|
|
654
|
+
if not isinstance(tool_use_id, str):
|
|
655
|
+
return
|
|
656
|
+
idx = summary.pending_graphify.pop(tool_use_id, None)
|
|
657
|
+
if idx is None or idx >= len(summary.graphify_queries):
|
|
658
|
+
return
|
|
659
|
+
_apply_graphify_outcome(summary.graphify_queries[idx], output, is_error)
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
def _tool_result_output(block: dict, raw: dict) -> str | None:
|
|
663
|
+
"""Text of a tool_result block, across the shapes claude emits.
|
|
664
|
+
|
|
665
|
+
``content`` is either a plain string or a list of ``{"type": "text",
|
|
666
|
+
"text": ...}`` blocks; the sibling ``tool_use_result.stdout`` on the
|
|
667
|
+
envelope is used as a fallback for Bash calls whose content came through
|
|
668
|
+
empty.
|
|
669
|
+
"""
|
|
670
|
+
content = block.get("content")
|
|
671
|
+
text: str | None = None
|
|
672
|
+
if isinstance(content, str):
|
|
673
|
+
text = content
|
|
674
|
+
elif isinstance(content, list):
|
|
675
|
+
parts = [
|
|
676
|
+
c.get("text")
|
|
677
|
+
for c in content
|
|
678
|
+
if isinstance(c, dict) and isinstance(c.get("text"), str)
|
|
679
|
+
]
|
|
680
|
+
text = "\n".join(parts) if parts else None
|
|
681
|
+
if text:
|
|
682
|
+
return text
|
|
683
|
+
tur = raw.get("tool_use_result")
|
|
684
|
+
if isinstance(tur, dict):
|
|
685
|
+
stdout = tur.get("stdout")
|
|
686
|
+
if isinstance(stdout, str):
|
|
687
|
+
return stdout
|
|
688
|
+
return text
|
|
689
|
+
|
|
690
|
+
|
|
498
691
|
def update_summary(summary: WorkerSummary, event: WorkerEvent) -> None:
|
|
499
692
|
"""Fold *event* into *summary* in-place."""
|
|
500
693
|
raw = event.raw
|
|
@@ -525,6 +718,7 @@ def update_summary(summary: WorkerSummary, event: WorkerEvent) -> None:
|
|
|
525
718
|
cmd = _command_from_input(block.get("input"))
|
|
526
719
|
if cmd:
|
|
527
720
|
summary.bash_commands.append(cmd)
|
|
721
|
+
record_graphify_call(summary, cmd, tool_use_id=block.get("id"))
|
|
528
722
|
elif name in ("Edit", "Write", "NotebookEdit"):
|
|
529
723
|
fp = _file_from_input(block.get("input"))
|
|
530
724
|
if fp:
|
|
@@ -540,12 +734,43 @@ def update_summary(summary: WorkerSummary, event: WorkerEvent) -> None:
|
|
|
540
734
|
cmd = _bash_command_from_event(event)
|
|
541
735
|
if cmd:
|
|
542
736
|
summary.bash_commands.append(cmd)
|
|
737
|
+
record_graphify_call(
|
|
738
|
+
summary, cmd, tool_use_id=raw.get("id") or raw.get("tool_use_id")
|
|
739
|
+
)
|
|
543
740
|
elif name in ("Edit", "Write", "NotebookEdit"):
|
|
544
741
|
fp = _file_path_from_event(event)
|
|
545
742
|
if fp:
|
|
546
743
|
summary.files_edited.append(fp)
|
|
547
744
|
return
|
|
548
745
|
|
|
746
|
+
# #2236: tool results arrive either as `user` messages carrying
|
|
747
|
+
# `tool_result` content blocks (claude's stream-json shape) or as
|
|
748
|
+
# standalone `tool_result` events (older/other providers). Both are
|
|
749
|
+
# folded here purely to attribute an outcome to a pending graphify call —
|
|
750
|
+
# nothing else in the summary depends on results, so an unrecognised
|
|
751
|
+
# shape just leaves the entry `"unknown"`.
|
|
752
|
+
if event.type == "user":
|
|
753
|
+
message = raw.get("message") or {}
|
|
754
|
+
for block in _iter_content_blocks(message):
|
|
755
|
+
if block.get("type") != "tool_result":
|
|
756
|
+
continue
|
|
757
|
+
_resolve_graphify_result(
|
|
758
|
+
summary,
|
|
759
|
+
block.get("tool_use_id"),
|
|
760
|
+
_tool_result_output(block, raw),
|
|
761
|
+
bool(block.get("is_error")),
|
|
762
|
+
)
|
|
763
|
+
return
|
|
764
|
+
|
|
765
|
+
if event.type == "tool_result":
|
|
766
|
+
_resolve_graphify_result(
|
|
767
|
+
summary,
|
|
768
|
+
raw.get("tool_use_id"),
|
|
769
|
+
_tool_result_output(raw, raw),
|
|
770
|
+
bool(raw.get("is_error")),
|
|
771
|
+
)
|
|
772
|
+
return
|
|
773
|
+
|
|
549
774
|
if event.type == "rate_limit_event":
|
|
550
775
|
status, resets = _rate_limit_info(raw)
|
|
551
776
|
if _is_rate_limit_throttled(status):
|
|
@@ -110,6 +110,50 @@ GRAPH_HEALTH: checkouts=3 stale=0
|
|
|
110
110
|
|
|
111
111
|
If it reports STALE, run `graphify update .` in that checkout.
|
|
112
112
|
|
|
113
|
+
## Measuring whether workers actually use it (#2212 / #2236)
|
|
114
|
+
|
|
115
|
+
Every reaped worker's log ends with a line the agent writes itself:
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
# reap: done (exit_code=0 status=DONE graphify_invocations=1 graph_present=1)
|
|
119
|
+
# graphify_query: outcome=hit results=81 cmd='graphify query "where is X handled"'
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
* **`graphify_invocations=N`** (#2212) — how many Bash calls this leg invoked the CLI in.
|
|
123
|
+
* **`graph_present=0|1`** (#2236) — whether the worktree had a **resolvable**
|
|
124
|
+
`graphify-out/graph.json` at reap time. Without it, `graphify_invocations=0` is ambiguous:
|
|
125
|
+
the worker prompt tells workers with no graph to *"skip straight to grep, silently"*, so a
|
|
126
|
+
repo that never onboarded (no graph, no `.githooks/post-checkout` — coord-portal and
|
|
127
|
+
stick-demo, as of this writing) produces zero-invocation legs that were **obeying** the rule,
|
|
128
|
+
not ignoring it. `graphify_invocations=0 graph_present=0` is a coverage gap; `=0` with
|
|
129
|
+
`graph_present=1` is a habit gap. Only the second is something prompt wording can move.
|
|
130
|
+
* **`# graphify_query:`** (#2236) — one line per call, with `outcome=hit|empty|error|unknown`,
|
|
131
|
+
the result count, and the command. `hit` vs `empty` separates *"queried and got an answer"*
|
|
132
|
+
from *"queried, got nothing, fell back to grep"* — opposite fixes: `empty` points at graph
|
|
133
|
+
coverage/quality, and no amount of prompting helps there.
|
|
134
|
+
|
|
135
|
+
`unknown` is honest, not a bug bucket — don't read it as "worker got no answer". Only
|
|
136
|
+
`graphify query` output is reliably countable (its `N nodes found` header, or a fallback
|
|
137
|
+
count of `NODE`/`EDGE`/`PATH`/`COMMUNITY` result rows, or graphify's own zero-match
|
|
138
|
+
phrasing, `"No matching/affected ... found."`). `graphify explain` and `graphify path` print
|
|
139
|
+
differently-shaped output with no countable header at all, so calls to those land in
|
|
140
|
+
`unknown` even when they returned a perfectly good answer. Skimming
|
|
141
|
+
`grep -c outcome=unknown` and reading it as "workers not getting answers" over-reads that
|
|
142
|
+
number — it may just mean "workers ran `explain`/`path`, not `query`".
|
|
143
|
+
|
|
144
|
+
Count them straight off the fleet's logs:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
grep -ho 'graphify_invocations=[0-9]* graph_present=[01]' ~/.coord/logs/*.log | sort | uniq -c
|
|
148
|
+
grep -ho 'graphify_query: outcome=[a-z]*' ~/.coord/logs/*.log | sort | uniq -c
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**`outcome=hit` means non-empty, not useful.** The counter cannot see relevance: a query
|
|
152
|
+
against a graph that indexed the wrong things returns rows and scores as a hit. A run of `hit`
|
|
153
|
+
outcomes that workers still abandon after one query is the signal that the graph's *content*,
|
|
154
|
+
not the worker's habit, is what needs work — cross-check with `coord diagnose --graph` for a
|
|
155
|
+
graph built from a stale SHA.
|
|
156
|
+
|
|
113
157
|
## Traps
|
|
114
158
|
|
|
115
159
|
**`core.hooksPath` REPLACES `.git/hooks` wholesale.** Git stops looking in `.git/hooks`
|