code-coordinator 0.5.81__tar.gz → 0.5.83__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.81 → code_coordinator-0.5.83}/CLAUDE.md +19 -3
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/PKG-INFO +1 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/SOURCES.txt +6 -3
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/scm_file_list.json +3 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agent.py +266 -33
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agent_app.py +80 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/claim.py +14 -10
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/dispatch.py +16 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/repo.py +131 -5
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/status.py +50 -6
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/comments.py +64 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dao.py +5 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/server.py +15 -0
- code_coordinator-0.5.81/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js → code_coordinator-0.5.83/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +1 -1
- code_coordinator-0.5.81/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js → code_coordinator-0.5.83/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +1 -1
- code_coordinator-0.5.81/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js → code_coordinator-0.5.83/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +34 -34
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/index.html +1 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/sw.js +1 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/realtime/events.ts +14 -4
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/diagnose.py +27 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dispatch.py +24 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/drive.py +58 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/drive_queue.py +47 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/drive_state.py +7 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/graph_health.py +269 -8
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/graph.py +15 -1
- code_coordinator-0.5.83/coord/health/checks/graphify_cli.py +87 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/models.py +41 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notify.py +34 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/reconcile.py +53 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/repo_onboard.py +400 -9
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/state.py +36 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/ARCHITECTURE.md +32 -6
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/GRAPHIFY_SETUP.md +30 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent.py +86 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_dirty_worktree.py +28 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_graph_self_heal.py +11 -2
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_zero_commit.py +270 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_claim.py +18 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dashboard.py +51 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_diagnose.py +42 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_drive.py +58 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_drive_queue.py +104 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_drive_state.py +2 -1
- code_coordinator-0.5.83/tests/test_graph_selfheal_absent_2237.py +212 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_checks.py +74 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_context.py +4 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_models.py +20 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notify.py +135 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reconcile_branch.py +163 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reconcile_completions.py +21 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reconcile_merges.py +42 -0
- code_coordinator-0.5.83/tests/test_repo_graph_fleet_2237.py +632 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_repo_onboard_2220.py +9 -1
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_retry_advisory_1606.py +22 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/pipeline.rs +15 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/tests.rs +25 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.gitignore +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/GOAL.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/LICENSE +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/MANIFEST.in +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/README.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/__init__.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/audit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/board_service.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/brain.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/cli.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/client.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/config.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/db.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deps.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/events.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/filelock.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/freshness.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/gates.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/goal.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/context.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/models.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/render.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/units.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/hooks.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/interactive.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/network.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/openapi.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/parentage.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/plans.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/progress.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/release_window.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/reports.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/review.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/smoke.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/split_work.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/test_author.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/test_report.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/usage.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/install-agent.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/pyproject.toml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/setup.cfg +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/__init__.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/conftest.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_config.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_db.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_events.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_init.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_network.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_session.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_split.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_state.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -42,13 +42,29 @@ bootstrap only runs where `core.hooksPath` is set: `git config core.hooksPath
|
|
|
42
42
|
rebase/merge/cherry-pick (so the merge agent's proactive rebase never rebuilds),
|
|
43
43
|
nothing fires at all for `git reset --hard`, every failure path is a silent
|
|
44
44
|
`exit 0` behind a detached 600s-timeout background process, concurrent triggers
|
|
45
|
-
coalesce, and their `[ ! -f graphify-out/graph.json ]` guard is
|
|
46
|
-
|
|
45
|
+
coalesce, and their `[ ! -f graphify-out/graph.json ]` guard is an off-switch
|
|
46
|
+
once the graph is purged. Treat the hooks as an optimization and check
|
|
47
47
|
freshness instead — `GRAPH_REPORT.md` records its source commit, and
|
|
48
48
|
**`coord diagnose --graph`** compares that to HEAD for every local checkout (and
|
|
49
49
|
flags an unset `core.hooksPath`). If it reports STALE, `graphify update .` in that
|
|
50
50
|
checkout.
|
|
51
51
|
|
|
52
|
+
**It mostly heals itself now (#1729, #2237).** Each agent's health tick rebuilds
|
|
53
|
+
a checkout whose graph is stale *or absent* — so `rm -rf graphify-out/` is no
|
|
54
|
+
longer permanent — subject to four guards: idle machines only, base checkouts
|
|
55
|
+
only (never a linked worktree), once per HEAD (a build that cannot succeed is
|
|
56
|
+
never a retry loop), and never `--force`. What it cannot do is anything
|
|
57
|
+
versioned: `.githooks/` are tracked files, so porting them to a repo is a PR
|
|
58
|
+
against that repo.
|
|
59
|
+
|
|
60
|
+
**`coord repo doctor <repo>`** reports graph readiness **per machine** (folded
|
|
61
|
+
from each agent's `/health`, no extra round trip) — the operator's laptop is
|
|
62
|
+
usually not where the workers run. `--fix` performs the machine-local half
|
|
63
|
+
(`graphify update .` where absent, `core.hooksPath` where unset) on every
|
|
64
|
+
machine that clones the repo; it is idempotent, never writes a tracked file,
|
|
65
|
+
and refuses on a repo whose `.githooks/` were never ported. A repo with no
|
|
66
|
+
graph on *any* machine that runs workers is CRIT and fails the gate.
|
|
67
|
+
|
|
52
68
|
Setting this up on a new machine: [`docs/GRAPHIFY_SETUP.md`](docs/GRAPHIFY_SETUP.md).
|
|
53
69
|
|
|
54
70
|
## Architecture
|
|
@@ -155,7 +171,7 @@ One line each — the reasoning behind them is in
|
|
|
155
171
|
- **`coordinator.yml` is the single source of truth** for repo topology, machine capabilities, dependencies, concurrency limits, review settings, smoke-test rules, and the pipeline gate order (`pipeline.default_gates`). It lives in `~/.coord/`, **not** the repo checkout.
|
|
156
172
|
- **User approves everything.** `coord plan` proposes, the user reviews, `coord approve` dispatches. No autonomous dispatch.
|
|
157
173
|
- **Claim detection prevents duplicate work.** Before dispatching, the coordinator checks the board for active assignments and the remote for `issue-{N}-*` branches.
|
|
158
|
-
- **Conflict rules are inferred, not configured
|
|
174
|
+
- **Conflict rules are inferred, not configured** — and only on the `coord plan` path. Overlap avoidance is a line in the planning brain's *prompt*, not a mechanism; the drive queue bypasses the brain entirely, so unattended work gets no file-overlap check. There is no `file_groups`/`exclusive_files` config.
|
|
159
175
|
- **Adversarial reviews are rule-enforcing, not rubber-stamping.** On worker completion a fresh `claude -p` session on a *different* machine reviews the PR diff against this file and the review checklist, with zero shared context with the worker — that's the whole point.
|
|
160
176
|
- **The pipeline order is `Work → Test → Review → Merge`.** Test precedes Review; the headless auto-loop holds review dispatch until there is a `passed`/`skipped` test verdict.
|
|
161
177
|
- **Merge is gated on CI checks (#240).** `coord merge` refuses when a check failed or is still running — and a PR with *zero* reported checks is not automatically clear either (#1904).
|
|
@@ -187,10 +187,10 @@ coord/dashboard/webapp/dist/index.html
|
|
|
187
187
|
coord/dashboard/webapp/dist/manifest.webmanifest
|
|
188
188
|
coord/dashboard/webapp/dist/sw.js
|
|
189
189
|
coord/dashboard/webapp/dist/workbox-e4022e15.js
|
|
190
|
-
coord/dashboard/webapp/dist/assets/Gallery-
|
|
190
|
+
coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js
|
|
191
191
|
coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css
|
|
192
|
-
coord/dashboard/webapp/dist/assets/Terminal-
|
|
193
|
-
coord/dashboard/webapp/dist/assets/index-
|
|
192
|
+
coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js
|
|
193
|
+
coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js
|
|
194
194
|
coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css
|
|
195
195
|
coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js
|
|
196
196
|
coord/dashboard/webapp/dist/icons/icon-192.png
|
|
@@ -311,6 +311,7 @@ coord/health/checks/fleet_deploy_lanes.py
|
|
|
311
311
|
coord/health/checks/fleet_phantom.py
|
|
312
312
|
coord/health/checks/fleet_unit_drift.py
|
|
313
313
|
coord/health/checks/graph.py
|
|
314
|
+
coord/health/checks/graphify_cli.py
|
|
314
315
|
coord/health/checks/plan_usage.py
|
|
315
316
|
coord/health/checks/repo_state.py
|
|
316
317
|
coord/health/checks/spawned_coord.py
|
|
@@ -577,6 +578,7 @@ tests/test_generated_types_fixture.py
|
|
|
577
578
|
tests/test_github_ops.py
|
|
578
579
|
tests/test_goal.py
|
|
579
580
|
tests/test_graph_health.py
|
|
581
|
+
tests/test_graph_selfheal_absent_2237.py
|
|
580
582
|
tests/test_handoff.py
|
|
581
583
|
tests/test_health_checks.py
|
|
582
584
|
tests/test_health_cli.py
|
|
@@ -673,6 +675,7 @@ tests/test_release_window.py
|
|
|
673
675
|
tests/test_remote_auto_prune.py
|
|
674
676
|
tests/test_remote_interactive_reaper.py
|
|
675
677
|
tests/test_repo_edit_2220.py
|
|
678
|
+
tests/test_repo_graph_fleet_2237.py
|
|
676
679
|
tests/test_repo_onboard_2220.py
|
|
677
680
|
tests/test_report_result_push.py
|
|
678
681
|
tests/test_reports.py
|
{code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -225,6 +225,7 @@
|
|
|
225
225
|
"coord/health/checks/fleet_phantom.py",
|
|
226
226
|
"coord/health/checks/fleet_unit_drift.py",
|
|
227
227
|
"coord/health/checks/graph.py",
|
|
228
|
+
"coord/health/checks/graphify_cli.py",
|
|
228
229
|
"coord/health/checks/plan_usage.py",
|
|
229
230
|
"coord/health/checks/repo_state.py",
|
|
230
231
|
"coord/health/checks/spawned_coord.py",
|
|
@@ -607,6 +608,7 @@
|
|
|
607
608
|
"tests/test_github_ops.py",
|
|
608
609
|
"tests/test_goal.py",
|
|
609
610
|
"tests/test_graph_health.py",
|
|
611
|
+
"tests/test_graph_selfheal_absent_2237.py",
|
|
610
612
|
"tests/test_handoff.py",
|
|
611
613
|
"tests/test_health_checks.py",
|
|
612
614
|
"tests/test_health_cli.py",
|
|
@@ -703,6 +705,7 @@
|
|
|
703
705
|
"tests/test_remote_auto_prune.py",
|
|
704
706
|
"tests/test_remote_interactive_reaper.py",
|
|
705
707
|
"tests/test_repo_edit_2220.py",
|
|
708
|
+
"tests/test_repo_graph_fleet_2237.py",
|
|
706
709
|
"tests/test_repo_onboard_2220.py",
|
|
707
710
|
"tests/test_report_result_push.py",
|
|
708
711
|
"tests/test_reports.py",
|
|
@@ -82,6 +82,21 @@ CANCELLED = "cancelled"
|
|
|
82
82
|
# would loop forever on "already implemented" reports); not a clean DONE
|
|
83
83
|
# either. Human should review and decide whether to re-dispatch or close.
|
|
84
84
|
ADVISORY = "advisory"
|
|
85
|
+
# #2234: a NARROWER shape of the #448 zero-commit exit — the worker's own
|
|
86
|
+
# final message shows it stopped because a STANDING repo rule (CLAUDE.md's
|
|
87
|
+
# "only the coordinator writes docs", or similar) makes the dispatched
|
|
88
|
+
# deliverable something no worker can complete, ever, on any attempt (see
|
|
89
|
+
# `_looks_like_policy_refusal`). This is deliberately a status distinct from
|
|
90
|
+
# ADVISORY, not a sub-case reported through it: every downstream consumer of
|
|
91
|
+
# ADVISORY (`coord drive`'s bounded retry, the queue's attempt budget, the
|
|
92
|
+
# terminal `blocked` bucket a human must `remove`) exists to handle "the
|
|
93
|
+
# worker got stuck or found nothing to do" — a condition retrying might fix.
|
|
94
|
+
# A policy refusal is the OPPOSITE: the worker did exactly the right thing,
|
|
95
|
+
# and retrying is guaranteed to reproduce the identical, correct refusal.
|
|
96
|
+
# Landing it in ADVISORY's bucket is what #2234 exists to stop — the #2195
|
|
97
|
+
# incident spent two drive attempts ($0.11 x 2, plus the overnight slot) and
|
|
98
|
+
# a terminal `blocked` rediscovering a rule that was never going to change.
|
|
99
|
+
REFUSED_POLICY = "refused_policy"
|
|
85
100
|
|
|
86
101
|
# #448: spec types that are expected to push commits, so a clean exit with
|
|
87
102
|
# zero commits is interesting (advisory). Review/smoke workers commit
|
|
@@ -167,6 +182,54 @@ _COMPLETED_HISTORY_CAP = 25
|
|
|
167
182
|
# within an operator's normal polling cadence.
|
|
168
183
|
_ADVISORY_TERMINAL_CHECK_COOLDOWN_S = 300.0
|
|
169
184
|
|
|
185
|
+
# #2234: markers that show up when a worker's OWN final message explains
|
|
186
|
+
# that it stopped because of a STANDING repo rule — not because it got stuck
|
|
187
|
+
# or ran out of turns. Matched only against the worker's own account (see
|
|
188
|
+
# `_looks_like_policy_refusal`), never against the briefing or issue body,
|
|
189
|
+
# which quote the same rules on every single dispatch and would false-
|
|
190
|
+
# positive on every assignment if matched directly. `claude.md` is the one
|
|
191
|
+
# filename standing worker-facing rules live in across this repo (see
|
|
192
|
+
# CLAUDE.md's own "Rules for workers" section, "Only the coordinator writes
|
|
193
|
+
# docs"); the rest are lifted verbatim from that same rule's text, which is
|
|
194
|
+
# the shape that triggered this issue (claude-coordinator#2195: an issue
|
|
195
|
+
# whose entire deliverable was a doc edit, dispatched to a worker that
|
|
196
|
+
# correctly refused and stopped). Deliberately permissive rather than
|
|
197
|
+
# requiring an exact quote — a weak/cheap model's terse refusal ("Confirmed:
|
|
198
|
+
# the rule exists verbatim at CLAUDE.md line 156...", the actual #2195
|
|
199
|
+
# transcript) may cite the rule without repeating "must not"/"forbidden"
|
|
200
|
+
# verbatim.
|
|
201
|
+
_POLICY_REFUSAL_MARKERS = (
|
|
202
|
+
"claude.md",
|
|
203
|
+
"files_forbidden",
|
|
204
|
+
"repo rule",
|
|
205
|
+
"repo's rule",
|
|
206
|
+
"coordinator work",
|
|
207
|
+
"only the coordinator",
|
|
208
|
+
"coordinator-only",
|
|
209
|
+
"should never have been dispatched",
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _looks_like_policy_refusal(text: str | None) -> bool:
|
|
214
|
+
"""#2234: does *text* — the worker's own final message — read as a
|
|
215
|
+
refusal grounded in a STANDING repo-rule prohibition, rather than a
|
|
216
|
+
stuck/incomplete session?
|
|
217
|
+
|
|
218
|
+
Only ever consulted on the zero-commit/clean-exit shape (`_reap` calls
|
|
219
|
+
this exactly where it would otherwise set `zero_commit_reason` — see
|
|
220
|
+
below): a worker that pushed real commits never reaches this check, so a
|
|
221
|
+
successful run that happens to mention `CLAUDE.md` in passing (e.g.
|
|
222
|
+
"per CLAUDE.md I ran the build before committing") carries no risk of
|
|
223
|
+
being reclassified. Within that already-narrow shape, an ordinary
|
|
224
|
+
`STUCK:`-style report (out of turns, couldn't find the code, a flaky
|
|
225
|
+
test) mentions none of :data:`_POLICY_REFUSAL_MARKERS`, so it is left
|
|
226
|
+
exactly as ADVISORY as it always was.
|
|
227
|
+
"""
|
|
228
|
+
if not text:
|
|
229
|
+
return False
|
|
230
|
+
lowered = text.lower()
|
|
231
|
+
return any(marker in lowered for marker in _POLICY_REFUSAL_MARKERS)
|
|
232
|
+
|
|
170
233
|
|
|
171
234
|
# ── Reap tuning ───────────────────────────────────────────────────────────────
|
|
172
235
|
# claude-cli sometimes does not exit after emitting its final
|
|
@@ -715,36 +778,20 @@ def _is_linked_worktree(repo_path: Path) -> bool:
|
|
|
715
778
|
def _graphify_update(repo_path: Path, *, timeout: float = 600.0) -> tuple[bool, str]:
|
|
716
779
|
"""Run ``graphify update .`` in *repo_path* (#1729, H-6's self-heal).
|
|
717
780
|
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
781
|
+
Thin delegate to :func:`coord.graph_health.run_graphify_update` (#2237),
|
|
782
|
+
which is the single place that decides what command coord shells out to
|
|
783
|
+
and with which flags — ``coord repo doctor --fix`` repairs checkouts on
|
|
784
|
+
every machine through the same function, and two copies of "the command
|
|
785
|
+
graphify's hooks run, never ``--force``" is exactly the split-brain that
|
|
786
|
+
would let one of them quietly acquire the flag that caused the
|
|
787
|
+
2026-08-02 incident.
|
|
723
788
|
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
same way: surface the reason on the health check and remember this
|
|
727
|
-
HEAD as attempted so the next tick does not retry it (guard 3).
|
|
789
|
+
Kept as a module-level name here because it is the seam the self-heal
|
|
790
|
+
tests patch. Returns ``(ok, detail)``.
|
|
728
791
|
"""
|
|
729
|
-
|
|
730
|
-
result = subprocess.run(
|
|
731
|
-
["graphify", "update", "."],
|
|
732
|
-
cwd=str(repo_path),
|
|
733
|
-
capture_output=True,
|
|
734
|
-
text=True,
|
|
735
|
-
timeout=timeout,
|
|
736
|
-
)
|
|
737
|
-
except FileNotFoundError:
|
|
738
|
-
return False, "graphify: command not found on this machine's PATH"
|
|
739
|
-
except subprocess.TimeoutExpired:
|
|
740
|
-
return False, f"graphify update . timed out after {timeout:.0f}s"
|
|
741
|
-
except OSError as exc:
|
|
742
|
-
return False, f"graphify update . failed to start: {exc}"
|
|
792
|
+
from coord.graph_health import run_graphify_update # noqa: PLC0415
|
|
743
793
|
|
|
744
|
-
|
|
745
|
-
reason = (result.stderr or result.stdout or "").strip()
|
|
746
|
-
return False, reason or f"graphify update . exited {result.returncode}"
|
|
747
|
-
return True, (result.stdout or "").strip()
|
|
794
|
+
return run_graphify_update(repo_path, timeout=timeout)
|
|
748
795
|
|
|
749
796
|
|
|
750
797
|
# #2212: count how many Bash commands in a worker's leg invoked `graphify` —
|
|
@@ -2941,6 +2988,16 @@ class AgentAssignment:
|
|
|
2941
2988
|
# (a normal work assignment's deliverable is the diff itself, already
|
|
2942
2989
|
# visible on the PR — restating the transcript there would be noise).
|
|
2943
2990
|
result_text: str | None = None
|
|
2991
|
+
# #2234: the worker's own final message when `_reap` classifies a clean
|
|
2992
|
+
# (exit_code==0), 0-commit exit as a policy refusal (`status ==
|
|
2993
|
+
# REFUSED_POLICY`) rather than the #448 ADVISORY default — see
|
|
2994
|
+
# `_looks_like_policy_refusal`. `None` on every other outcome, including
|
|
2995
|
+
# an ordinary zero-commit ADVISORY (no marker matched) and the #2188
|
|
2996
|
+
# analysis-deliverable success shape (mutually exclusive with this one:
|
|
2997
|
+
# both are decided in the same `_ahead == 0` branch of `_reap`, and only
|
|
2998
|
+
# one of `analysis_deliverable`/`zero_commit_reason`/this field is ever
|
|
2999
|
+
# set for a given assignment).
|
|
3000
|
+
policy_refusal_reason: str | None = None
|
|
2944
3001
|
|
|
2945
3002
|
def to_dict(self) -> dict:
|
|
2946
3003
|
d = asdict(self)
|
|
@@ -4151,6 +4208,21 @@ class AgentServer:
|
|
|
4151
4208
|
# already follows.
|
|
4152
4209
|
self._graph_rebuild_in_progress: set[str] = set()
|
|
4153
4210
|
|
|
4211
|
+
# #2237 item 7: guard 1 (the idle-gate) skips the whole self-heal
|
|
4212
|
+
# pass whenever this machine has a RUNNING assignment. Sensible —
|
|
4213
|
+
# a rebuild during a worker's leg fights it for CPU — but it means
|
|
4214
|
+
# the BUSIEST machine in the fleet gets the FEWEST heal windows,
|
|
4215
|
+
# which is the opposite of where drift accumulates. Nothing recorded
|
|
4216
|
+
# that, so "this machine never gets an idle window" was
|
|
4217
|
+
# indistinguishable from "this machine never needed a heal".
|
|
4218
|
+
# Measure before changing the guard: these two counters ride
|
|
4219
|
+
# /health's `graph_self_heal` block so the ratio is observable, and
|
|
4220
|
+
# only if it turns out to be common does the guard need replacing
|
|
4221
|
+
# with a heal window.
|
|
4222
|
+
self._graph_heal_skipped_active: int = 0
|
|
4223
|
+
self._graph_heal_last_skip_at: float | None = None
|
|
4224
|
+
self._graph_heal_passes: int = 0
|
|
4225
|
+
|
|
4154
4226
|
self.state_dir.mkdir(parents=True, exist_ok=True)
|
|
4155
4227
|
self.log_dir.mkdir(parents=True, exist_ok=True)
|
|
4156
4228
|
self._load_state()
|
|
@@ -4163,7 +4235,7 @@ class AgentServer:
|
|
|
4163
4235
|
completed = sum(
|
|
4164
4236
|
1
|
|
4165
4237
|
for a in self._assignments.values()
|
|
4166
|
-
if a.status in (DONE, FAILED, CANCELLED, ADVISORY)
|
|
4238
|
+
if a.status in (DONE, FAILED, CANCELLED, ADVISORY, REFUSED_POLICY)
|
|
4167
4239
|
)
|
|
4168
4240
|
worktree_bytes = self._cached_worktree_bytes()
|
|
4169
4241
|
artifact_bytes = self._cached_artifact_bytes()
|
|
@@ -4224,6 +4296,19 @@ class AgentServer:
|
|
|
4224
4296
|
# block (`_cached_local_health`'s own try/except) rather than
|
|
4225
4297
|
# omitting the key, so an old/new client can always find it.
|
|
4226
4298
|
"health": self._cached_local_health(),
|
|
4299
|
+
# #2237 item 7: how often the graph self-heal pass has actually
|
|
4300
|
+
# run on this machine, and how often guard 1 (the idle-gate)
|
|
4301
|
+
# turned it away because an assignment was RUNNING. The busiest
|
|
4302
|
+
# host in the fleet is the one most likely to drift AND the least
|
|
4303
|
+
# likely to be idle, so "never healed" and "never needed healing"
|
|
4304
|
+
# were indistinguishable until this. Cheap, in-memory, resets on
|
|
4305
|
+
# agent restart — it exists to answer "is the idle-gate starving
|
|
4306
|
+
# this machine", not to be a durable metric.
|
|
4307
|
+
"graph_self_heal": {
|
|
4308
|
+
"passes": self._graph_heal_passes,
|
|
4309
|
+
"skipped_active": self._graph_heal_skipped_active,
|
|
4310
|
+
"last_skip_at": self._graph_heal_last_skip_at,
|
|
4311
|
+
},
|
|
4227
4312
|
}
|
|
4228
4313
|
|
|
4229
4314
|
def _cached_local_health(self) -> dict:
|
|
@@ -4288,6 +4373,19 @@ class AgentServer:
|
|
|
4288
4373
|
"""React to the ``graph`` check's STATE verdict instead of chasing
|
|
4289
4374
|
the git events that produced it (#1729, H-6).
|
|
4290
4375
|
|
|
4376
|
+
Covers a **missing** graph as well as a stale one (#2237 item 5).
|
|
4377
|
+
Ongoing drift was already handled here; absence was not, because
|
|
4378
|
+
``graph_status`` returns early for a checkout with no
|
|
4379
|
+
``graphify-out/graph.json`` and never computes ``stale`` — so this
|
|
4380
|
+
pass skipped it, and so did the graphify hooks' own
|
|
4381
|
+
``[ ! -f graphify-out/graph.json ] && exit 0``. Two independent
|
|
4382
|
+
mechanisms declining to rebuild a graph that is not there made a
|
|
4383
|
+
single ``rm -rf graphify-out/`` (or a fresh clone on a machine that
|
|
4384
|
+
never had one) permanent until a human intervened. The guards below
|
|
4385
|
+
are unchanged and cover the absent case as-is — in particular guard
|
|
4386
|
+
3, which is what stops a repo where ``graphify update .`` genuinely
|
|
4387
|
+
cannot succeed from retrying every poll forever.
|
|
4388
|
+
|
|
4291
4389
|
The git hooks (`.githooks/`) are event-driven and structurally
|
|
4292
4390
|
cannot cover every ref-moving operation — rebase/merge/cherry-pick
|
|
4293
4391
|
`exit 0`, `git reset --hard` fires no hook at all, and every hook
|
|
@@ -4304,8 +4402,13 @@ class AgentServer:
|
|
|
4304
4402
|
1. **Idle-gate.** Only when this machine has no RUNNING assignment.
|
|
4305
4403
|
A rebuild is hundreds of files across many workers; running it
|
|
4306
4404
|
while a worker is mid-build steals the CPU that worker was
|
|
4307
|
-
dispatched for.
|
|
4308
|
-
|
|
4405
|
+
dispatched for. Every skip is counted
|
|
4406
|
+
(`_graph_heal_skipped_active`, surfaced as /health's
|
|
4407
|
+
`graph_self_heal` block) because the guard's cost lands hardest
|
|
4408
|
+
on the busiest machine — the one most likely to drift — and
|
|
4409
|
+
#2237 item 7 asks for that to be measured before the guard is
|
|
4410
|
+
traded for a heal window. This reads `self._assignments` under a
|
|
4411
|
+
brief lock and releases it before the (possibly slow) rebuild runs —
|
|
4309
4412
|
load-bearing for guard-adjacent requirement #1625 decision 3:
|
|
4310
4413
|
health must stay advisory, so a dispatch landing mid-rebuild
|
|
4311
4414
|
must never be delayed by it (see `_graphify_update`, called
|
|
@@ -4360,13 +4463,32 @@ class AgentServer:
|
|
|
4360
4463
|
with self._lock:
|
|
4361
4464
|
active = sum(1 for a in self._assignments.values() if a.status == RUNNING)
|
|
4362
4465
|
if active:
|
|
4466
|
+
# #2237 item 7: count the skip instead of returning silently, so
|
|
4467
|
+
# "the busiest machine never heals" is a number an operator can
|
|
4468
|
+
# read off /health rather than an inference from a graph that
|
|
4469
|
+
# stays stale.
|
|
4470
|
+
self._graph_heal_skipped_active += 1
|
|
4471
|
+
self._graph_heal_last_skip_at = time.time()
|
|
4363
4472
|
return
|
|
4473
|
+
self._graph_heal_passes += 1
|
|
4364
4474
|
|
|
4365
4475
|
for i, result in enumerate(report.results):
|
|
4366
4476
|
if result.check_id != "graph":
|
|
4367
4477
|
continue
|
|
4368
4478
|
values = result.values or {}
|
|
4369
|
-
|
|
4479
|
+
# #2237 item 5: ABSENT counts, not just stale. `graph_status`
|
|
4480
|
+
# returns early with `unknown_reason` when there is no
|
|
4481
|
+
# graphify-out/graph.json, so `stale` is never even computed for a
|
|
4482
|
+
# never-built (or `rm -rf`'d) checkout — which meant two
|
|
4483
|
+
# independent mechanisms declined to rebuild a graph that is not
|
|
4484
|
+
# there: this gate, and the graphify hooks' own
|
|
4485
|
+
# `[ ! -f graphify-out/graph.json ] && exit 0`. Between them, a
|
|
4486
|
+
# single `rm -rf graphify-out/` was permanent. Guard 3's
|
|
4487
|
+
# once-per-HEAD bookkeeping below keys on `head_sha`, which a
|
|
4488
|
+
# never-built checkout now carries (#2237 in `graph_health`), so a
|
|
4489
|
+
# repo where the build genuinely cannot succeed still gets exactly
|
|
4490
|
+
# one attempt per HEAD rather than one per poll.
|
|
4491
|
+
if not values.get("stale") and values.get("present", True):
|
|
4370
4492
|
continue
|
|
4371
4493
|
path_str = values.get("path")
|
|
4372
4494
|
if not path_str:
|
|
@@ -5321,6 +5443,51 @@ class AgentServer:
|
|
|
5321
5443
|
servable.append(repo_name)
|
|
5322
5444
|
return servable, degraded
|
|
5323
5445
|
|
|
5446
|
+
def fix_graph(self, repo_name: str, *, timeout: float = 600.0) -> dict:
|
|
5447
|
+
"""Repair the machine-local half of graphify for *repo_name* here
|
|
5448
|
+
(#2237 item 1 — the agent side of ``coord repo doctor --fix``).
|
|
5449
|
+
|
|
5450
|
+
The whole point of routing this through the agent is that the
|
|
5451
|
+
operator's laptop is *not* where the workers run: layer 5 was the one
|
|
5452
|
+
onboarding layer probed only on the machine running the command, so a
|
|
5453
|
+
repo with a graph on the operator's box and none on dellserver
|
|
5454
|
+
reported clean. Repairing it has the same shape — a fix that only
|
|
5455
|
+
ever repairs the local clone fixes the machine that needed it least.
|
|
5456
|
+
|
|
5457
|
+
Idempotent and never touches a tracked file:
|
|
5458
|
+
:func:`coord.graph_health.apply_local_graph_fix` sets
|
|
5459
|
+
``core.hooksPath`` and builds a missing graph, and refuses outright
|
|
5460
|
+
when the repo does not ship ``.githooks/post-checkout`` (a versioned
|
|
5461
|
+
change, which is a PR against that repo and must never be automated).
|
|
5462
|
+
|
|
5463
|
+
Returns the :meth:`~coord.graph_health.GraphFixResult.to_dict` shape
|
|
5464
|
+
plus ``repo``. An unknown repo, or one with no checkout on this
|
|
5465
|
+
machine, comes back as a ``refused`` result rather than an error —
|
|
5466
|
+
the caller is sweeping every machine and wants a per-machine answer,
|
|
5467
|
+
not an exception that hides the other machines' results.
|
|
5468
|
+
"""
|
|
5469
|
+
from coord.graph_health import GraphFixResult, apply_local_graph_fix # noqa: PLC0415
|
|
5470
|
+
|
|
5471
|
+
path_str = self.repo_paths.get(repo_name)
|
|
5472
|
+
if not path_str:
|
|
5473
|
+
result = GraphFixResult(
|
|
5474
|
+
repo_path="",
|
|
5475
|
+
refused=f"no repo_path configured for {repo_name!r} on this machine",
|
|
5476
|
+
)
|
|
5477
|
+
return {**result.to_dict(), "repo": repo_name}
|
|
5478
|
+
|
|
5479
|
+
repo_path = Path(path_str).expanduser()
|
|
5480
|
+
result = apply_local_graph_fix(repo_path, timeout=timeout)
|
|
5481
|
+
# A rebuild that succeeds here invalidates whatever this HEAD was
|
|
5482
|
+
# last recorded as failing (guard 3's bookkeeping) — otherwise the
|
|
5483
|
+
# self-heal would keep replaying a stale failure reason at an
|
|
5484
|
+
# operator who just fixed it by hand.
|
|
5485
|
+
if result.ok:
|
|
5486
|
+
with self._lock:
|
|
5487
|
+
self._graph_rebuild_failed.pop(str(repo_path), None)
|
|
5488
|
+
self._local_health_cache = None
|
|
5489
|
+
return {**result.to_dict(), "repo": repo_name}
|
|
5490
|
+
|
|
5324
5491
|
def list_repos(self) -> dict[str, dict]:
|
|
5325
5492
|
"""Return local HEAD / branch / dirty flag for each configured repo.
|
|
5326
5493
|
|
|
@@ -6011,17 +6178,28 @@ class AgentServer:
|
|
|
6011
6178
|
``zero_commit_reason`` when the reap already flagged ADVISORY, since
|
|
6012
6179
|
that is the string `coord status`, the dashboard and the GitHub
|
|
6013
6180
|
advisory comment all render) is what makes the loss visible.
|
|
6181
|
+
|
|
6182
|
+
#2234 fix-1: mirrors the same rewrite for a REFUSED_POLICY reap —
|
|
6183
|
+
``policy_refusal_reason`` (not ``zero_commit_reason``) is the string
|
|
6184
|
+
the refused_policy GitHub comment and `coord status` render for that
|
|
6185
|
+
status, so a dirty worktree left behind by an otherwise-correct
|
|
6186
|
+
policy refusal needs the same visibility, on the field that surface
|
|
6187
|
+
actually reads.
|
|
6014
6188
|
"""
|
|
6015
6189
|
with self._lock:
|
|
6016
6190
|
live = self._assignments.get(assignment.id, assignment)
|
|
6017
6191
|
live.dirty_worktree_reason = reason
|
|
6018
6192
|
if live.status == ADVISORY:
|
|
6019
6193
|
live.zero_commit_reason = reason
|
|
6194
|
+
elif live.status == REFUSED_POLICY:
|
|
6195
|
+
live.policy_refusal_reason = reason
|
|
6020
6196
|
# Keep the caller's object in sync when it isn't the live one, so
|
|
6021
6197
|
# a caller holding a detached copy still sees the outcome.
|
|
6022
6198
|
assignment.dirty_worktree_reason = reason
|
|
6023
6199
|
if assignment.status == ADVISORY:
|
|
6024
6200
|
assignment.zero_commit_reason = reason
|
|
6201
|
+
elif assignment.status == REFUSED_POLICY:
|
|
6202
|
+
assignment.policy_refusal_reason = reason
|
|
6025
6203
|
self._persist()
|
|
6026
6204
|
|
|
6027
6205
|
def _rescue_uncommitted_work(
|
|
@@ -7379,6 +7557,11 @@ class AgentServer:
|
|
|
7379
7557
|
# assignment.
|
|
7380
7558
|
_analysis_deliverable = False
|
|
7381
7559
|
_zero_commit_reason: str | None = None
|
|
7560
|
+
# #2234: set alongside (never together with) `_zero_commit_reason` —
|
|
7561
|
+
# both are decided in the SAME `_ahead == 0` branch below so the two
|
|
7562
|
+
# readings of "0 commits" can never disagree about which one applies
|
|
7563
|
+
# to this assignment.
|
|
7564
|
+
_policy_refusal_reason: str | None = None
|
|
7382
7565
|
if (exit_code == 0 and assignment is not None
|
|
7383
7566
|
and assignment.worktree_path
|
|
7384
7567
|
and assignment.spec.type in _ZERO_COMMIT_TYPES):
|
|
@@ -7399,6 +7582,30 @@ class AgentServer:
|
|
|
7399
7582
|
)
|
|
7400
7583
|
except OSError:
|
|
7401
7584
|
pass
|
|
7585
|
+
elif _worker_summary is not None and _looks_like_policy_refusal(
|
|
7586
|
+
_worker_summary.result_text
|
|
7587
|
+
):
|
|
7588
|
+
# #2234: the worker's own final message cites a
|
|
7589
|
+
# standing repo-rule prohibition as the reason it
|
|
7590
|
+
# stopped — the #2195 shape. Distinct from the
|
|
7591
|
+
# ADVISORY fallback below: retrying this assignment
|
|
7592
|
+
# cannot change a rule that isn't going anywhere, so
|
|
7593
|
+
# it must not consume the queue's attempt budget or
|
|
7594
|
+
# land in the same bucket as a genuinely stuck
|
|
7595
|
+
# worker.
|
|
7596
|
+
_policy_refusal_reason = _worker_summary.result_text or (
|
|
7597
|
+
"worker cited a standing repo-rule prohibition"
|
|
7598
|
+
)
|
|
7599
|
+
try:
|
|
7600
|
+
with open(assignment.log_path, "a") as reopen:
|
|
7601
|
+
reopen.write(
|
|
7602
|
+
"# reap: refused_policy — 0 commits ahead "
|
|
7603
|
+
f"of {_base}; worker's final message cites "
|
|
7604
|
+
"a standing repo-rule prohibition, status "
|
|
7605
|
+
"set to refused_policy (#2234)\n"
|
|
7606
|
+
)
|
|
7607
|
+
except OSError:
|
|
7608
|
+
pass
|
|
7402
7609
|
else:
|
|
7403
7610
|
_zero_commit_reason = (
|
|
7404
7611
|
"worker exited cleanly but pushed 0 commits"
|
|
@@ -7472,6 +7679,17 @@ class AgentServer:
|
|
|
7472
7679
|
# shrug.
|
|
7473
7680
|
assignment.status = FAILED
|
|
7474
7681
|
assignment.push_failure_reason = _push_failure_reason
|
|
7682
|
+
elif _policy_refusal_reason is not None:
|
|
7683
|
+
# #2234: clean exit, no commits, and the worker's own
|
|
7684
|
+
# final message cites a standing repo-rule
|
|
7685
|
+
# prohibition — a distinct, permanent shape of "0
|
|
7686
|
+
# commits", not the generic #448 ADVISORY. Checked
|
|
7687
|
+
# BEFORE `_zero_commit_reason` (the two are mutually
|
|
7688
|
+
# exclusive by construction — see the `_reap`
|
|
7689
|
+
# computation above — so the order is never actually
|
|
7690
|
+
# load-bearing, kept parallel to it for readability).
|
|
7691
|
+
assignment.status = REFUSED_POLICY
|
|
7692
|
+
assignment.policy_refusal_reason = _policy_refusal_reason
|
|
7475
7693
|
elif _zero_commit_reason is not None:
|
|
7476
7694
|
# #448: clean exit but no commits → advisory, not done.
|
|
7477
7695
|
assignment.status = ADVISORY
|
|
@@ -7732,8 +7950,16 @@ class AgentServer:
|
|
|
7732
7950
|
):
|
|
7733
7951
|
return
|
|
7734
7952
|
self._last_advisory_terminal_check = now
|
|
7953
|
+
# #2234: REFUSED_POLICY joins ADVISORY here for the same reason
|
|
7954
|
+
# — both are terminal, zero-commit statuses the agent would
|
|
7955
|
+
# otherwise keep serving indefinitely from its own `/status`
|
|
7956
|
+
# feed once GitHub confirms the work is done, forcing every
|
|
7957
|
+
# downstream consumer (dashboard, TUI, any future client) to
|
|
7958
|
+
# reimplement the same GitHub-terminality filter this method
|
|
7959
|
+
# exists to spare them.
|
|
7735
7960
|
candidates = [
|
|
7736
|
-
a for a in self._assignments.values()
|
|
7961
|
+
a for a in self._assignments.values()
|
|
7962
|
+
if a.status in (ADVISORY, REFUSED_POLICY)
|
|
7737
7963
|
]
|
|
7738
7964
|
if not candidates:
|
|
7739
7965
|
return
|
|
@@ -7805,7 +8031,14 @@ class AgentServer:
|
|
|
7805
8031
|
ordered = list(self._assignments.values())
|
|
7806
8032
|
superseded_ids: list[str] = []
|
|
7807
8033
|
for i, a in enumerate(ordered):
|
|
7808
|
-
|
|
8034
|
+
# #2234: REFUSED_POLICY joins ADVISORY here too — a refusal
|
|
8035
|
+
# for issue X can be superseded the same way an advisory can
|
|
8036
|
+
# (e.g. the coordinator re-scopes the issue so a later
|
|
8037
|
+
# dispatch's deliverable is no longer coordinator-only, and
|
|
8038
|
+
# that later attempt reaches DONE). Same in-memory
|
|
8039
|
+
# comparison, same root cause as `_prune_terminal_advisory`
|
|
8040
|
+
# above.
|
|
8041
|
+
if a.status not in (ADVISORY, REFUSED_POLICY):
|
|
7809
8042
|
continue
|
|
7810
8043
|
key = (a.spec.repo_name, a.spec.issue_number)
|
|
7811
8044
|
for later in ordered[i + 1 :]:
|