code-coordinator 0.5.47__tar.gz → 0.5.49__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.49/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/CLAUDE.md +2 -1
- {code_coordinator-0.5.47/code_coordinator.egg-info → code_coordinator-0.5.49}/PKG-INFO +1 -1
- {code_coordinator-0.5.47 → code_coordinator-0.5.49/code_coordinator.egg-info}/PKG-INFO +1 -1
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/SOURCES.txt +29 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/scm_file_list.json +29 -0
- code_coordinator-0.5.49/code_coordinator.egg-info/scm_version.json +8 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/acceptance.py +34 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/agent.py +163 -1
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/agent_app.py +395 -47
- code_coordinator-0.5.49/coord/agent_update.py +864 -0
- code_coordinator-0.5.49/coord/bug_intake.py +117 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/cli.py +4 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/agent_ops.py +51 -10
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/dispatch.py +51 -2
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/drive.py +50 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/issues.py +56 -1
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/merge.py +18 -1
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/release.py +39 -7
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/status.py +8 -2
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/config.py +340 -4
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-release-window.timer +2 -2
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-web-dist-build.service +2 -2
- code_coordinator-0.5.49/coord/deploy/coord-web-dist-build.timer +61 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dispatch.py +37 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/drive.py +142 -7
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/drive_queue.py +206 -12
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/deploy_lane_facts.py +145 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/interactive.py +123 -2
- code_coordinator-0.5.49/coord/notifier/__init__.py +32 -0
- code_coordinator-0.5.49/coord/notifier/baseline.py +329 -0
- code_coordinator-0.5.49/coord/notifier/cli.py +255 -0
- code_coordinator-0.5.49/coord/notifier/collect.py +341 -0
- code_coordinator-0.5.49/coord/notifier/digest.py +171 -0
- code_coordinator-0.5.49/coord/notifier/models.py +185 -0
- code_coordinator-0.5.49/coord/notifier/predicate.py +453 -0
- code_coordinator-0.5.49/coord/notifier/service.py +252 -0
- code_coordinator-0.5.49/coord/notifier/store.py +312 -0
- code_coordinator-0.5.49/coord/notifier/transport.py +196 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/notify.py +14 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/reconcile.py +88 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/release_cordon.py +22 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/release_propagate.py +66 -16
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/release_verify.py +42 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/release_window.py +25 -6
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/serve_app.py +49 -1
- code_coordinator-0.5.49/coord/spend_ceiling.py +291 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/usage.py +42 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coordinator.example.yml +130 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-release-window.timer +2 -2
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-web-dist-build.service +2 -2
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-web-dist-build.sh +82 -15
- code_coordinator-0.5.49/deploy/coord-web-dist-build.timer +61 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-web-rollback.sh +5 -5
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/DRIVE_QUEUE.md +37 -0
- code_coordinator-0.5.49/docs/NOTIFIER.md +233 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/TEST_FIRST_BUG_LANE.md +134 -3
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/conftest.py +49 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_acceptance.py +41 -0
- code_coordinator-0.5.49/tests/test_agent_idle_restart.py +453 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_update.py +175 -11
- code_coordinator-0.5.49/tests/test_bug_intake.py +93 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_drive_queue.py +170 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_issue_create_label.py +56 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_merge.py +101 -3
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_release_propagate.py +137 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_coord_web_dist.py +103 -4
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_drive.py +380 -2
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_drive_queue.py +370 -2
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_drive_tmux.py +3 -1
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_deploy_lane_facts.py +127 -0
- code_coordinator-0.5.49/tests/test_interactive_token_attribution.py +463 -0
- code_coordinator-0.5.49/tests/test_notifier_baseline.py +201 -0
- code_coordinator-0.5.49/tests/test_notifier_cli.py +198 -0
- code_coordinator-0.5.49/tests/test_notifier_collect.py +243 -0
- code_coordinator-0.5.49/tests/test_notifier_config.py +150 -0
- code_coordinator-0.5.49/tests/test_notifier_drive_seam.py +130 -0
- code_coordinator-0.5.49/tests/test_notifier_isolation.py +250 -0
- code_coordinator-0.5.49/tests/test_notifier_predicate.py +381 -0
- code_coordinator-0.5.49/tests/test_notifier_quiet_hours.py +161 -0
- code_coordinator-0.5.49/tests/test_notifier_service.py +365 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_release_propagate.py +67 -13
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_release_verify.py +89 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_serve.py +35 -1
- code_coordinator-0.5.49/tests/test_spend_ceiling.py +537 -0
- code_coordinator-0.5.49/tests/test_spend_ceiling_coordinator.py +315 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_usage.py +145 -0
- code_coordinator-0.5.49/tests/test_venv_live_install_2121.py +551 -0
- code_coordinator-0.5.47/code_coordinator.egg-info/scm_version.json +0 -8
- code_coordinator-0.5.47/coord/agent_update.py +0 -417
- code_coordinator-0.5.47/coord/deploy/coord-web-dist-build.timer +0 -36
- code_coordinator-0.5.47/deploy/coord-web-dist-build.timer +0 -36
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.gitignore +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/GOAL.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/LICENSE +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/MANIFEST.in +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/README.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/__init__.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/audit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/board_service.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/brain.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/claim.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/client.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/comments.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dao.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/db.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deps.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/events.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/filelock.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/freshness.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/gates.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/goal.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/context.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/models.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/render.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/units.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/hooks.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/models.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/network.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/openapi.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/parentage.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/plans.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/progress.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/reports.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/review.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/smoke.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/split_work.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/state.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/test_author.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/test_report.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/install-agent.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/pyproject.toml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/setup.cfg +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/__init__.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_config.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_db.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_events.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_init.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_models.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_network.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_session.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_split.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_state.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: >-
|
|
4
|
+
Report broken behaviour for the test-first bug lane (docs/TEST_FIRST_BUG_LANE.md).
|
|
5
|
+
Fill in all four sections — a bug report missing any of them can't be turned
|
|
6
|
+
into a red test.
|
|
7
|
+
title: ''
|
|
8
|
+
labels: bug
|
|
9
|
+
assignees: ''
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!--
|
|
13
|
+
This is the test-first bug lane's intake contract (docs/TEST_FIRST_BUG_LANE.md
|
|
14
|
+
"The intake contract", #1964). All four sections below are required. They are
|
|
15
|
+
what a hand-authored (or agent-assisted) `contract.md` gets derived from — no
|
|
16
|
+
milestone, no UX mock, no Gate-A sign-off required.
|
|
17
|
+
|
|
18
|
+
`coord issue create --expected --actual --repro --evidence` renders this same
|
|
19
|
+
structure from the CLI (coord/bug_intake.py is the single source of truth for
|
|
20
|
+
the four headings — keep this file's headings in sync with it).
|
|
21
|
+
-->
|
|
22
|
+
|
|
23
|
+
## Expected behaviour
|
|
24
|
+
|
|
25
|
+
<!-- What should happen, in observable terms. -->
|
|
26
|
+
|
|
27
|
+
## Actual behaviour
|
|
28
|
+
|
|
29
|
+
<!-- What happens instead. -->
|
|
30
|
+
|
|
31
|
+
## Reproduction
|
|
32
|
+
|
|
33
|
+
<!-- The shortest path to see it: exact steps/commands, starting from a clean checkout. -->
|
|
34
|
+
|
|
35
|
+
## Evidence
|
|
36
|
+
|
|
37
|
+
<!--
|
|
38
|
+
Screenshot, wireframe, OR a reference implementation that behaves correctly
|
|
39
|
+
(a sibling backend, or a prior release). A reference implementation is the
|
|
40
|
+
highest-value form of evidence — it makes the expectation executable by
|
|
41
|
+
construction ("X should look like Y here" is a complete specification).
|
|
42
|
+
-->
|
|
@@ -82,7 +82,7 @@ coord merge [--dry-run] [--repo NAME] [--method rebase|squash|merge] [--order ID
|
|
|
82
82
|
coord reconcile-merges # Backfill missing branches + record out-of-band merges (#609/#611)
|
|
83
83
|
coord retry|stop|resume <id> # Recovery; `coord done` ends the session
|
|
84
84
|
```
|
|
85
|
-
Setup / diagnostics (discoverable via `--help`): `coord init`, `coord config`, `coord agent`, `coord serve`, `coord web`, `coord diagnose`, `coord sessions [--remote]`, `coord split
|
|
85
|
+
Setup / diagnostics (discoverable via `--help`): `coord init`, `coord config`, `coord agent`, `coord serve`, `coord web`, `coord diagnose`, `coord sessions [--remote]`, `coord split`, `coord notifier` ([`docs/NOTIFIER.md`](docs/NOTIFIER.md)).
|
|
86
86
|
|
|
87
87
|
## Development
|
|
88
88
|
|
|
@@ -118,6 +118,7 @@ coord assign --dry-run precision claude-coordinator 42
|
|
|
118
118
|
- **Test precedes Review — the pipeline order is `Work → Test → Review → Merge`.** The smoke test runs *before* the PR/review (the natural order: smoke before PR), reversing the #520 "get the review over with first" workaround now that the agent-assisted Testing stage is smooth. This is enforced in two places that must stay in sync: (1) the **displayed** stage order comes from `pipeline.default_gates = ["test","review","merge"]` (`coord/config.py`; an old DB carrying the #520-era `["review","test","merge"]` is migrated in `coord/db.py`); (2) the **headless** auto-loop holds review dispatch until the work has a `passed`/`skipped` test verdict whenever `default_gates` orders test before review — `PipelineConfig.test_precedes_review()` drives `dispatch_pending_reviews` (`coord/review.py`). The explicit `coord review`/`coord pr` paths stay ungated so a human can always force a review. (The merge gate already required a test verdict — `requires_smoke` — so the human test touchpoint just moved earlier, and review cycles are no longer burned on untested code.)
|
|
119
119
|
- **Interactive testing + merge agents drive the Test → Review → Merge handoff (leg 3c / A3, #350/#581/#306/#606).** From a Pipeline row's right-click menu, the TUI routes **board-driven** verdicts (never TTY-scraped, ToS §3.7) along `Work → Test → Review → Merge`: **Start testing** = `coord assign --interactive --smoke-of <work_aid>` (read-only testing agent in the live checkout; records the verdict via `coord test --passed|--fail`); a `passed`/`skipped` test → **pass→review** (launches the interactive review); an approved review → **Start merge** = `--merge-of <work_aid>` (worktrees + proactively rebases onto the default branch #306, resolves mechanical conflicts (semantic with the operator), runs tests, `git push --force-with-lease`, then `coord verify-merge` and — if clean — `coord merge` itself to complete it #606); a `failed` test **or** request-changes review → one-key **`--fix-of`** on the same branch (a test-fail takes the identical action as a request-changes; `--fix-of` accepts a review id **or** a test-failed work id, the #581 front door). The merge agent is still gated on CI/review/smoke (a gate failure is reported, not forced) and `verify-merge` (#604) runs first. Full walkthrough: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
|
|
120
120
|
- **Progress streaming from workers.** Workers emit `STATUS:` and `STUCK:` lines in their logs. The coordinator parses these for real-time progress reporting in `coord status` and the dashboard.
|
|
121
|
+
- **The notifier tells you when NOBODY IS COMING — and nothing else (#1632).** `coord/notifier/` pushes to a self-hosted ntfy on the daemon host (over Tailscale, so no event text leaves the tailnet) when the pipeline **has stopped or is stalled and will not advance without a human**: a halted drive, a gate parked `HUMAN_REQUIRED`, a worker's `STUCK:`, a stall that survived `drive`'s nudge (#1593), a leg running far past comparable work, a fleet CRIT that invalidates in-flight work. It is **not** an error channel and **not** a progress feed — a failed test, a request-changes review and a mechanical merge conflict are all things the auto-loop handles, and pushing them is what trains an operator to mute the channel; in normal operation this fires approximately never. "Far too long" is **learned, never a fixed timeout**: p90 of a `(repo, type, tier)`-stratified population built from the durations milestone #37 already records, with a cold-start state (<5 samples → a generous absolute ceiling, said out loud in the message) so it never fires off a population of one. Quiet hours (22:00–08:00, daemon-local, `notifications.quiet_hours`) are a **deferral window, not a filter** — events are held and delivered as one 08:00 digest, nothing is discarded, and **no severity pierces them**; the only exception is `coord drive --urgent`, which is a deadline rather than a severity and expires with the drive. The whole subsystem is **advisory and isolated** (#1485's lesson): `tick()` never raises, every collector source fails open, state lives in its own `~/.coord/notifier.json`, and an unreachable ntfy server cannot affect dispatch, routing, the board or any verdict. It rides #1616's daemon clock rather than shipping a second one, and reads `drive`'s stall decision rather than defining "stalled" again. Off by default. Full rationale: [`docs/NOTIFIER.md`](docs/NOTIFIER.md).
|
|
121
122
|
- **Failure reassignment.** Failed assignments can be retried on a different machine via `coord retry`. With `concurrency.auto_reassign: true`, reconciliation auto-retries on a different machine.
|
|
122
123
|
- **Dependency freshness checks.** Before dispatching, `coord approve` checks whether upstream repos are up-to-date on the target machine. Stale dependencies trigger warnings or auto-pull with `--auto-pull`.
|
|
123
124
|
|
|
@@ -14,6 +14,7 @@ pyproject.toml
|
|
|
14
14
|
.githooks/post-checkout
|
|
15
15
|
.githooks/post-commit
|
|
16
16
|
.githooks/post-merge
|
|
17
|
+
.github/ISSUE_TEMPLATE/bug_report.md
|
|
17
18
|
.github/workflows/auto-release.yml
|
|
18
19
|
.github/workflows/cargo-test.yml
|
|
19
20
|
.github/workflows/publish.yml
|
|
@@ -41,6 +42,7 @@ coord/board_service.py
|
|
|
41
42
|
coord/board_wire.py
|
|
42
43
|
coord/brain.py
|
|
43
44
|
coord/branch_model.py
|
|
45
|
+
coord/bug_intake.py
|
|
44
46
|
coord/cargo_cache.py
|
|
45
47
|
coord/ci_github.py
|
|
46
48
|
coord/ci_store.py
|
|
@@ -113,6 +115,7 @@ coord/review.py
|
|
|
113
115
|
coord/scorecard.py
|
|
114
116
|
coord/serve_app.py
|
|
115
117
|
coord/smoke.py
|
|
118
|
+
coord/spend_ceiling.py
|
|
116
119
|
coord/split_work.py
|
|
117
120
|
coord/stage_projection.py
|
|
118
121
|
coord/state.py
|
|
@@ -310,6 +313,16 @@ coord/health/checks/toolchain.py
|
|
|
310
313
|
coord/health/checks/unit_drift.py
|
|
311
314
|
coord/health/checks/unit_enablement.py
|
|
312
315
|
coord/health/checks/worktrees.py
|
|
316
|
+
coord/notifier/__init__.py
|
|
317
|
+
coord/notifier/baseline.py
|
|
318
|
+
coord/notifier/cli.py
|
|
319
|
+
coord/notifier/collect.py
|
|
320
|
+
coord/notifier/digest.py
|
|
321
|
+
coord/notifier/models.py
|
|
322
|
+
coord/notifier/predicate.py
|
|
323
|
+
coord/notifier/service.py
|
|
324
|
+
coord/notifier/store.py
|
|
325
|
+
coord/notifier/transport.py
|
|
313
326
|
coord/providers/__init__.py
|
|
314
327
|
coord/providers/base.py
|
|
315
328
|
coord/providers/claude.py
|
|
@@ -349,6 +362,7 @@ docs/GRAPHIFY_SETUP.md
|
|
|
349
362
|
docs/ISSUE_GUIDANCE.md
|
|
350
363
|
docs/MAC_MINI.md
|
|
351
364
|
docs/MERGE_AUTO_DRAIN_TRUST_BAR.md
|
|
365
|
+
docs/NOTIFIER.md
|
|
352
366
|
docs/OPENCODE_VERIFICATION.md
|
|
353
367
|
docs/OPERATING_GOTCHAS.md
|
|
354
368
|
docs/ORACLE_LOOP.md
|
|
@@ -401,6 +415,7 @@ tests/test_agent_deploy_units_endpoint.py
|
|
|
401
415
|
tests/test_agent_dirty_worktree.py
|
|
402
416
|
tests/test_agent_graph_self_heal.py
|
|
403
417
|
tests/test_agent_health_h3.py
|
|
418
|
+
tests/test_agent_idle_restart.py
|
|
404
419
|
tests/test_agent_push_failure.py
|
|
405
420
|
tests/test_agent_reap.py
|
|
406
421
|
tests/test_agent_repos_and_pull.py
|
|
@@ -427,6 +442,7 @@ tests/test_board_state.py
|
|
|
427
442
|
tests/test_board_wire.py
|
|
428
443
|
tests/test_brain.py
|
|
429
444
|
tests/test_branch_model.py
|
|
445
|
+
tests/test_bug_intake.py
|
|
430
446
|
tests/test_build_worker_image_env_update.py
|
|
431
447
|
tests/test_cargo_cache.py
|
|
432
448
|
tests/test_ci_acceptance_gate_1950.py
|
|
@@ -568,6 +584,7 @@ tests/test_interactive_briefing_echo.py
|
|
|
568
584
|
tests/test_interactive_prefill_state.py
|
|
569
585
|
tests/test_interactive_session_relaunch.py
|
|
570
586
|
tests/test_interactive_test_verdict_backstop.py
|
|
587
|
+
tests/test_interactive_token_attribution.py
|
|
571
588
|
tests/test_interactive_worktree.py
|
|
572
589
|
tests/test_issue_store_seam.py
|
|
573
590
|
tests/test_liveness_auditor.py
|
|
@@ -590,6 +607,15 @@ tests/test_new_issue_chat.py
|
|
|
590
607
|
tests/test_next_release_tag.py
|
|
591
608
|
tests/test_no_direct_gh_calls.py
|
|
592
609
|
tests/test_node_shim.py
|
|
610
|
+
tests/test_notifier_baseline.py
|
|
611
|
+
tests/test_notifier_cli.py
|
|
612
|
+
tests/test_notifier_collect.py
|
|
613
|
+
tests/test_notifier_config.py
|
|
614
|
+
tests/test_notifier_drive_seam.py
|
|
615
|
+
tests/test_notifier_isolation.py
|
|
616
|
+
tests/test_notifier_predicate.py
|
|
617
|
+
tests/test_notifier_quiet_hours.py
|
|
618
|
+
tests/test_notifier_service.py
|
|
593
619
|
tests/test_notify.py
|
|
594
620
|
tests/test_notify_drain.py
|
|
595
621
|
tests/test_openapi.py
|
|
@@ -652,6 +678,8 @@ tests/test_slice_issue_attribution.py
|
|
|
652
678
|
tests/test_smoke.py
|
|
653
679
|
tests/test_smoke_live_checkout_restore.py
|
|
654
680
|
tests/test_smoke_workflow.py
|
|
681
|
+
tests/test_spend_ceiling.py
|
|
682
|
+
tests/test_spend_ceiling_coordinator.py
|
|
655
683
|
tests/test_split.py
|
|
656
684
|
tests/test_split_work.py
|
|
657
685
|
tests/test_stage_projection.py
|
|
@@ -677,6 +705,7 @@ tests/test_transcript_floor.py
|
|
|
677
705
|
tests/test_usage.py
|
|
678
706
|
tests/test_usage_limits.py
|
|
679
707
|
tests/test_usage_rollup.py
|
|
708
|
+
tests/test_venv_live_install_2121.py
|
|
680
709
|
tests/test_version_single_source.py
|
|
681
710
|
tests/test_watch.py
|
|
682
711
|
tests/test_worker_events.py
|
{code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
".githooks/post-checkout",
|
|
8
8
|
".githooks/post-commit",
|
|
9
9
|
".githooks/post-merge",
|
|
10
|
+
".github/ISSUE_TEMPLATE/bug_report.md",
|
|
10
11
|
".github/workflows/auto-release.yml",
|
|
11
12
|
".github/workflows/cargo-test.yml",
|
|
12
13
|
".github/workflows/publish.yml",
|
|
@@ -35,6 +36,7 @@
|
|
|
35
36
|
"coord/board_wire.py",
|
|
36
37
|
"coord/brain.py",
|
|
37
38
|
"coord/branch_model.py",
|
|
39
|
+
"coord/bug_intake.py",
|
|
38
40
|
"coord/cargo_cache.py",
|
|
39
41
|
"coord/ci_github.py",
|
|
40
42
|
"coord/ci_store.py",
|
|
@@ -251,6 +253,16 @@
|
|
|
251
253
|
"coord/models.py",
|
|
252
254
|
"coord/network.py",
|
|
253
255
|
"coord/new_issue_chat.py",
|
|
256
|
+
"coord/notifier/__init__.py",
|
|
257
|
+
"coord/notifier/baseline.py",
|
|
258
|
+
"coord/notifier/cli.py",
|
|
259
|
+
"coord/notifier/collect.py",
|
|
260
|
+
"coord/notifier/digest.py",
|
|
261
|
+
"coord/notifier/models.py",
|
|
262
|
+
"coord/notifier/predicate.py",
|
|
263
|
+
"coord/notifier/service.py",
|
|
264
|
+
"coord/notifier/store.py",
|
|
265
|
+
"coord/notifier/transport.py",
|
|
254
266
|
"coord/notify.py",
|
|
255
267
|
"coord/openapi.py",
|
|
256
268
|
"coord/overlap_fence.py",
|
|
@@ -281,6 +293,7 @@
|
|
|
281
293
|
"coord/serve_app.py",
|
|
282
294
|
"coord/skills/update-issue/SKILL.md",
|
|
283
295
|
"coord/smoke.py",
|
|
296
|
+
"coord/spend_ceiling.py",
|
|
284
297
|
"coord/split_work.py",
|
|
285
298
|
"coord/stage_projection.py",
|
|
286
299
|
"coord/state.py",
|
|
@@ -327,6 +340,7 @@
|
|
|
327
340
|
"docs/ISSUE_GUIDANCE.md",
|
|
328
341
|
"docs/MAC_MINI.md",
|
|
329
342
|
"docs/MERGE_AUTO_DRAIN_TRUST_BAR.md",
|
|
343
|
+
"docs/NOTIFIER.md",
|
|
330
344
|
"docs/OPENCODE_VERIFICATION.md",
|
|
331
345
|
"docs/OPERATING_GOTCHAS.md",
|
|
332
346
|
"docs/ORACLE_LOOP.md",
|
|
@@ -431,6 +445,7 @@
|
|
|
431
445
|
"tests/test_agent_dirty_worktree.py",
|
|
432
446
|
"tests/test_agent_graph_self_heal.py",
|
|
433
447
|
"tests/test_agent_health_h3.py",
|
|
448
|
+
"tests/test_agent_idle_restart.py",
|
|
434
449
|
"tests/test_agent_push_failure.py",
|
|
435
450
|
"tests/test_agent_reap.py",
|
|
436
451
|
"tests/test_agent_repos_and_pull.py",
|
|
@@ -457,6 +472,7 @@
|
|
|
457
472
|
"tests/test_board_wire.py",
|
|
458
473
|
"tests/test_brain.py",
|
|
459
474
|
"tests/test_branch_model.py",
|
|
475
|
+
"tests/test_bug_intake.py",
|
|
460
476
|
"tests/test_build_worker_image_env_update.py",
|
|
461
477
|
"tests/test_cargo_cache.py",
|
|
462
478
|
"tests/test_ci_acceptance_gate_1950.py",
|
|
@@ -598,6 +614,7 @@
|
|
|
598
614
|
"tests/test_interactive_prefill_state.py",
|
|
599
615
|
"tests/test_interactive_session_relaunch.py",
|
|
600
616
|
"tests/test_interactive_test_verdict_backstop.py",
|
|
617
|
+
"tests/test_interactive_token_attribution.py",
|
|
601
618
|
"tests/test_interactive_worktree.py",
|
|
602
619
|
"tests/test_issue_store_seam.py",
|
|
603
620
|
"tests/test_liveness_auditor.py",
|
|
@@ -620,6 +637,15 @@
|
|
|
620
637
|
"tests/test_next_release_tag.py",
|
|
621
638
|
"tests/test_no_direct_gh_calls.py",
|
|
622
639
|
"tests/test_node_shim.py",
|
|
640
|
+
"tests/test_notifier_baseline.py",
|
|
641
|
+
"tests/test_notifier_cli.py",
|
|
642
|
+
"tests/test_notifier_collect.py",
|
|
643
|
+
"tests/test_notifier_config.py",
|
|
644
|
+
"tests/test_notifier_drive_seam.py",
|
|
645
|
+
"tests/test_notifier_isolation.py",
|
|
646
|
+
"tests/test_notifier_predicate.py",
|
|
647
|
+
"tests/test_notifier_quiet_hours.py",
|
|
648
|
+
"tests/test_notifier_service.py",
|
|
623
649
|
"tests/test_notify.py",
|
|
624
650
|
"tests/test_notify_drain.py",
|
|
625
651
|
"tests/test_openapi.py",
|
|
@@ -682,6 +708,8 @@
|
|
|
682
708
|
"tests/test_smoke.py",
|
|
683
709
|
"tests/test_smoke_live_checkout_restore.py",
|
|
684
710
|
"tests/test_smoke_workflow.py",
|
|
711
|
+
"tests/test_spend_ceiling.py",
|
|
712
|
+
"tests/test_spend_ceiling_coordinator.py",
|
|
685
713
|
"tests/test_split.py",
|
|
686
714
|
"tests/test_split_work.py",
|
|
687
715
|
"tests/test_stage_projection.py",
|
|
@@ -707,6 +735,7 @@
|
|
|
707
735
|
"tests/test_usage.py",
|
|
708
736
|
"tests/test_usage_limits.py",
|
|
709
737
|
"tests/test_usage_rollup.py",
|
|
738
|
+
"tests/test_venv_live_install_2121.py",
|
|
710
739
|
"tests/test_version_single_source.py",
|
|
711
740
|
"tests/test_watch.py",
|
|
712
741
|
"tests/test_worker_events.py",
|
|
@@ -53,6 +53,40 @@ def _mocks_dir(milestone_number: int) -> str:
|
|
|
53
53
|
return f"{ACCEPTANCE_DIRNAME}/{ms_dirname(milestone_number)}/mocks"
|
|
54
54
|
|
|
55
55
|
|
|
56
|
+
def issue_dirname(issue_number: int) -> str:
|
|
57
|
+
"""The ``issue-NN`` directory name for a single-issue bug-lane contract
|
|
58
|
+
(docs/TEST_FIRST_BUG_LANE.md "The intake contract", #1964) — the bug
|
|
59
|
+
lane's counterpart to :func:`ms_dirname`, with no milestone in the name
|
|
60
|
+
because a bug has none.
|
|
61
|
+
|
|
62
|
+
This is purely a naming convention, not new plumbing: the manifest
|
|
63
|
+
scanner below (:func:`_manifest_paths`) globs ``*/manifest.*`` under
|
|
64
|
+
``tests/acceptance/`` regardless of what the directory is called, so an
|
|
65
|
+
``issue-NN/`` slice is discovered, run (``coord acceptance run --issue
|
|
66
|
+
N``), recorded (``coord acceptance record``), and injected into the
|
|
67
|
+
worker's briefing (:func:`oracle_loop_contract_block`) by the exact same
|
|
68
|
+
code path as an ``ms-NN/`` one — see ``TestOracleLoopContractBlock`` in
|
|
69
|
+
``tests/test_acceptance.py``, which already proves the block is built
|
|
70
|
+
from whatever the owning directory happens to be named. Pinning the name
|
|
71
|
+
here just keeps every bug-lane contract in the same shape.
|
|
72
|
+
"""
|
|
73
|
+
return f"issue-{issue_number}"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def bug_contract_path(issue_number: int) -> str:
|
|
77
|
+
"""Repo-relative path to *issue_number*'s single-issue bug-lane contract
|
|
78
|
+
(docs/TEST_FIRST_BUG_LANE.md "The intake contract").
|
|
79
|
+
|
|
80
|
+
Unlike :func:`gate_a_contract_path`, nothing gates dispatch on this
|
|
81
|
+
existing — a bug issue has no milestone, so there is no Gate A to block
|
|
82
|
+
on it. It is hand-authored (or agent-assisted) directly from the four
|
|
83
|
+
intake fields (:mod:`coord.bug_intake`); once it — and a
|
|
84
|
+
``manifest.yml`` alongside it — exist, the issue behaves exactly like an
|
|
85
|
+
authored ``ms-NN`` slice to every downstream command.
|
|
86
|
+
"""
|
|
87
|
+
return f"{ACCEPTANCE_DIRNAME}/{issue_dirname(issue_number)}/contract.md"
|
|
88
|
+
|
|
89
|
+
|
|
56
90
|
# Mock-fixture file extension -> the driver ``kind`` it implies (the SAME
|
|
57
91
|
# rule each ``AcceptanceDriverConfig.mock`` glob already encodes in
|
|
58
92
|
# coordinator.yml / docs/ORACLE_LOOP.md: ``"*.screen"`` for ``tui-tuidriver``,
|
|
@@ -235,6 +235,15 @@ _PTY_INJECT_RETRY_BACKOFF_S = 0.4
|
|
|
235
235
|
_FIRST_OUTPUT_TIMEOUT = 600.0 # seconds of zero output before the watchdog kills
|
|
236
236
|
NO_FIRST_OUTPUT_EXIT = 124 # exit code reported when the TTFT watchdog fires
|
|
237
237
|
|
|
238
|
+
# #2131: distinct exit code for a leg killed by the per-leg spend ceiling. It
|
|
239
|
+
# must NOT collide with NO_FIRST_OUTPUT_EXIT (or any plausible worker exit
|
|
240
|
+
# code) — `_reap` keys the `spend_ceiling_reason` stamp off it, and that stamp
|
|
241
|
+
# is the ONLY thing that makes a ceiling kill distinguishable from a crash for
|
|
242
|
+
# `coord retry` and the auto-reassign skip. Any non-zero value still lands the
|
|
243
|
+
# assignment on FAILED via the existing reap branch; the value only selects
|
|
244
|
+
# which diagnostic gets attached.
|
|
245
|
+
SPEND_CEILING_EXIT = 125
|
|
246
|
+
|
|
238
247
|
|
|
239
248
|
def _append_log_line(log_path: str, line: str) -> None:
|
|
240
249
|
"""Best-effort append of a single line to the assignment log. Never raises."""
|
|
@@ -344,6 +353,8 @@ def _wait_for_proc_or_result(
|
|
|
344
353
|
grace_after_result: float = _REAP_GRACE_AFTER_RESULT,
|
|
345
354
|
max_wait: float = _REAP_MAX_WAIT,
|
|
346
355
|
first_output_timeout: float = _FIRST_OUTPUT_TIMEOUT,
|
|
356
|
+
cost_ceiling_usd: float | None = None,
|
|
357
|
+
read_cost_usd: "Callable[[], float | None] | None" = None,
|
|
347
358
|
killpg: Callable[[int, int], None] = _killpg_safe,
|
|
348
359
|
log_has_result: Callable[[str], bool] = _log_has_result,
|
|
349
360
|
log_has_output: Callable[[str], bool] = _log_has_output,
|
|
@@ -364,12 +375,44 @@ def _wait_for_proc_or_result(
|
|
|
364
375
|
satisfied permanently — it never re-arms — so a slow-but-emitting (e.g.
|
|
365
376
|
rate-limited) worker is never killed by it. See #299.
|
|
366
377
|
|
|
378
|
+
Per-leg spend ceiling (#2131): when ``cost_ceiling_usd`` is a positive
|
|
379
|
+
number and ``read_cost_usd`` is supplied, the worker's live spend is
|
|
380
|
+
sampled on every poll. At :data:`coord.spend_ceiling.WARN_FRACTION` of
|
|
381
|
+
the ceiling a one-shot ``STATUS:`` warning is written to the worker's own
|
|
382
|
+
log — so a watching operator gets a chance to intervene, and the kill is
|
|
383
|
+
legible after the fact. At or above the ceiling the process group is
|
|
384
|
+
killed and :data:`SPEND_CEILING_EXIT` is returned so ``_reap`` records a
|
|
385
|
+
ceiling kill rather than a generic failure.
|
|
386
|
+
|
|
387
|
+
Three properties of that check matter and are deliberate:
|
|
388
|
+
|
|
389
|
+
* **Fail open.** ``read_cost_usd`` returning ``None`` (unreadable log,
|
|
390
|
+
not stream-json, nothing priceable yet) never kills anything — killing
|
|
391
|
+
real work over a parse failure is worse than the overspend.
|
|
392
|
+
* **Never after the result event.** Once the worker has emitted its final
|
|
393
|
+
``result`` the leg is logically finished and the money is already
|
|
394
|
+
spent; killing then would only mislabel a completed leg as a ceiling
|
|
395
|
+
kill. So the check is skipped once ``result_seen_at`` is set.
|
|
396
|
+
* **SIGKILL, not SIGTERM.** The whole point is to stop spending now; a
|
|
397
|
+
graceful shutdown that keeps talking to the API defeats it. Whatever
|
|
398
|
+
the worker committed is still on disk, and ``_reap``'s existing
|
|
399
|
+
safety-net push still runs afterwards.
|
|
400
|
+
|
|
367
401
|
The keyword-only parameters exist for tests to inject short timeouts and
|
|
368
|
-
mock kill/clock behavior.
|
|
402
|
+
mock kill/clock/cost behavior.
|
|
369
403
|
"""
|
|
370
404
|
start = clock()
|
|
371
405
|
result_seen_at: float | None = None
|
|
372
406
|
output_seen = False
|
|
407
|
+
cost_warned = False
|
|
408
|
+
ceiling_armed = bool(
|
|
409
|
+
cost_ceiling_usd and cost_ceiling_usd > 0 and read_cost_usd is not None
|
|
410
|
+
)
|
|
411
|
+
if ceiling_armed:
|
|
412
|
+
# Hoisted out of the poll loop — this runs every `poll_interval`.
|
|
413
|
+
from coord.spend_ceiling import WARN_FRACTION # noqa: PLC0415
|
|
414
|
+
|
|
415
|
+
warn_at = cost_ceiling_usd * WARN_FRACTION
|
|
373
416
|
|
|
374
417
|
while True:
|
|
375
418
|
try:
|
|
@@ -406,6 +449,37 @@ def _wait_for_proc_or_result(
|
|
|
406
449
|
"# reap: worker emitted result; awaiting clean exit\n",
|
|
407
450
|
)
|
|
408
451
|
|
|
452
|
+
# #2131: per-leg spend ceiling. Only while the leg is still running
|
|
453
|
+
# (see the docstring for why a post-`result` kill is never useful),
|
|
454
|
+
# and only ever acting on a value the meter could actually read.
|
|
455
|
+
if ceiling_armed and result_seen_at is None:
|
|
456
|
+
try:
|
|
457
|
+
spent = read_cost_usd()
|
|
458
|
+
except Exception: # noqa: BLE001 — fail open, never break the reap
|
|
459
|
+
spent = None
|
|
460
|
+
if spent is not None:
|
|
461
|
+
if not cost_warned and spent >= warn_at:
|
|
462
|
+
cost_warned = True
|
|
463
|
+
_append_log_line(
|
|
464
|
+
log_path,
|
|
465
|
+
f"STATUS: spend ${spent:.2f} has passed "
|
|
466
|
+
f"{WARN_FRACTION:.0%} of the ${cost_ceiling_usd:.2f} "
|
|
467
|
+
"per-leg ceiling → the leg will be killed if it "
|
|
468
|
+
"reaches the ceiling → confidence: high (#2131)\n",
|
|
469
|
+
)
|
|
470
|
+
if spent >= cost_ceiling_usd:
|
|
471
|
+
_append_log_line(
|
|
472
|
+
log_path,
|
|
473
|
+
f"# reap: SIGKILL — spend ceiling breached "
|
|
474
|
+
f"(${spent:.2f} of ${cost_ceiling_usd:.2f}) (#2131)\n",
|
|
475
|
+
)
|
|
476
|
+
killpg(proc.pid, signal.SIGKILL)
|
|
477
|
+
try:
|
|
478
|
+
proc.wait(timeout=5)
|
|
479
|
+
except subprocess.TimeoutExpired:
|
|
480
|
+
pass
|
|
481
|
+
return SPEND_CEILING_EXIT
|
|
482
|
+
|
|
409
483
|
if result_seen_at is not None and clock() - result_seen_at >= grace_after_result:
|
|
410
484
|
# Worker logically done but process group still alive — force-kill.
|
|
411
485
|
_append_log_line(
|
|
@@ -517,6 +591,19 @@ class AssignmentSpec:
|
|
|
517
591
|
# :meth:`AgentServer._resolve_provider` for the full resolution chain —
|
|
518
592
|
# this field existing does not, on its own, get honoured anywhere else.
|
|
519
593
|
provider_def: "dict[str, Any] | None" = None
|
|
594
|
+
# #2131: per-leg spend ceiling in USD, resolved coordinator-side from
|
|
595
|
+
# `budget.ceiling_for(type)` (coord/config.py) and carried here rather
|
|
596
|
+
# than read from the agent's own config — a config-free agent
|
|
597
|
+
# (docs/EPHEMERAL_WORKERS.md) has none to read. `None` (the default, and
|
|
598
|
+
# what every agent sees when the coordinator has no `budget:` block)
|
|
599
|
+
# means NO CEILING: the reap's watchdog never samples cost and behaves
|
|
600
|
+
# exactly as it did pre-#2131.
|
|
601
|
+
#
|
|
602
|
+
# `coord/dispatch.py` omits the key entirely when there is no ceiling, so
|
|
603
|
+
# an agent predating this field never sees an unrecognized kwarg (
|
|
604
|
+
# `AssignmentSpec(**body)` in agent_app.py 400s on those) unless the
|
|
605
|
+
# operator has actually configured one.
|
|
606
|
+
cost_ceiling_usd: float | None = None
|
|
520
607
|
|
|
521
608
|
|
|
522
609
|
class _GitError(RuntimeError):
|
|
@@ -2685,6 +2772,21 @@ class AgentAssignment:
|
|
|
2685
2772
|
# instead of leaving it to expand at push time) surfaced only as a line
|
|
2686
2773
|
# in the worker log that nothing downstream ever read.
|
|
2687
2774
|
push_failure_reason: str | None = None
|
|
2775
|
+
# #2131: set when the reap's watchdog killed this leg because its live
|
|
2776
|
+
# spend crossed `spec.cost_ceiling_usd`. Formatted with
|
|
2777
|
+
# `coord.spend_ceiling.format_spend_ceiling_reason` (stable "spend
|
|
2778
|
+
# ceiling — " prefix, recognised by `is_spend_ceiling_reason`). Only ever
|
|
2779
|
+
# set alongside `status == FAILED` (the kill returns the non-zero
|
|
2780
|
+
# `SPEND_CEILING_EXIT`), and `None` on every other outcome.
|
|
2781
|
+
#
|
|
2782
|
+
# This field is the WHOLE POINT of #2131's "not a generic failure"
|
|
2783
|
+
# requirement: the coordinator stamps it onto the board's persisted
|
|
2784
|
+
# `failure_reason` (coord/reconcile.py) so `coord retry` can refuse to
|
|
2785
|
+
# silently re-spend, `auto_reassign` can decline to re-dispatch it, and
|
|
2786
|
+
# the escalation record can name what actually happened. Without it a
|
|
2787
|
+
# ceiling kill is indistinguishable from a crash and the money is spent
|
|
2788
|
+
# again on the next pass.
|
|
2789
|
+
spend_ceiling_reason: str | None = None
|
|
2688
2790
|
|
|
2689
2791
|
def to_dict(self) -> dict:
|
|
2690
2792
|
d = asdict(self)
|
|
@@ -4934,6 +5036,18 @@ class AgentServer:
|
|
|
4934
5036
|
prog = None
|
|
4935
5037
|
if prog:
|
|
4936
5038
|
d["progress"] = prog
|
|
5039
|
+
# #1632: when this worker last SAID anything, as Unix
|
|
5040
|
+
# seconds. The output-silence probe is the one that catches
|
|
5041
|
+
# failures with no symptom except duration, and only this
|
|
5042
|
+
# machine can see its own log file — the coordinator cannot
|
|
5043
|
+
# stat a remote path. A single `stat` on a file that is
|
|
5044
|
+
# already open for append, wrapped so a vanished log can
|
|
5045
|
+
# never break `/status`.
|
|
5046
|
+
if a.log_path:
|
|
5047
|
+
try:
|
|
5048
|
+
d["last_output_at"] = os.path.getmtime(a.log_path)
|
|
5049
|
+
except OSError:
|
|
5050
|
+
pass
|
|
4937
5051
|
# Tail-read stream-json log for live summary fields.
|
|
4938
5052
|
if a.log_path and is_stream_json(a.log_path):
|
|
4939
5053
|
try:
|
|
@@ -6823,6 +6937,25 @@ class AgentServer:
|
|
|
6823
6937
|
else:
|
|
6824
6938
|
_log_has_result_fn = _log_has_result
|
|
6825
6939
|
|
|
6940
|
+
# #2131: arm the per-leg spend ceiling when the coordinator sent one.
|
|
6941
|
+
# The meter is built here (not inside the wait loop) so the same
|
|
6942
|
+
# instance survives the whole run and can be re-read afterwards for
|
|
6943
|
+
# the reason string — it reads the log incrementally, so a full
|
|
6944
|
+
# re-parse never happens on any poll.
|
|
6945
|
+
_cost_ceiling: float | None = None
|
|
6946
|
+
_cost_meter = None
|
|
6947
|
+
if _reap_start is not None:
|
|
6948
|
+
_raw_ceiling = getattr(_reap_start.spec, "cost_ceiling_usd", None)
|
|
6949
|
+
if isinstance(_raw_ceiling, (int, float)) and _raw_ceiling > 0:
|
|
6950
|
+
try:
|
|
6951
|
+
from coord.spend_ceiling import LiveCostMeter # noqa: PLC0415
|
|
6952
|
+
|
|
6953
|
+
_cost_ceiling = float(_raw_ceiling)
|
|
6954
|
+
_cost_meter = LiveCostMeter(log_path)
|
|
6955
|
+
except Exception: # noqa: BLE001 — fail open, never break reap
|
|
6956
|
+
_cost_ceiling = None
|
|
6957
|
+
_cost_meter = None
|
|
6958
|
+
|
|
6826
6959
|
# Use a polling wait that handles claude-cli's well-known habit of
|
|
6827
6960
|
# not exiting after emitting its final result event (a child of the
|
|
6828
6961
|
# process group keeps the session alive). See #228.
|
|
@@ -6830,9 +6963,31 @@ class AgentServer:
|
|
|
6830
6963
|
proc, log_path,
|
|
6831
6964
|
first_output_timeout=self.first_output_timeout,
|
|
6832
6965
|
log_has_result=_log_has_result_fn,
|
|
6966
|
+
cost_ceiling_usd=_cost_ceiling,
|
|
6967
|
+
read_cost_usd=_cost_meter.read if _cost_meter is not None else None,
|
|
6833
6968
|
)
|
|
6834
6969
|
log_fh.close()
|
|
6835
6970
|
|
|
6971
|
+
# #2131: turn the ceiling kill into the stable, greppable diagnostic
|
|
6972
|
+
# every downstream consumer keys off. Uses the meter's LAST observed
|
|
6973
|
+
# value rather than re-reading, so the number in the reason is
|
|
6974
|
+
# exactly the one the kill decision was made on.
|
|
6975
|
+
_spend_ceiling_reason: str | None = None
|
|
6976
|
+
if exit_code == SPEND_CEILING_EXIT and _cost_ceiling is not None:
|
|
6977
|
+
try:
|
|
6978
|
+
from coord.spend_ceiling import ( # noqa: PLC0415
|
|
6979
|
+
format_spend_ceiling_reason,
|
|
6980
|
+
)
|
|
6981
|
+
|
|
6982
|
+
_observed = (_cost_meter.last if _cost_meter is not None else None)
|
|
6983
|
+
_spend_ceiling_reason = format_spend_ceiling_reason(
|
|
6984
|
+
_observed if _observed is not None else _cost_ceiling,
|
|
6985
|
+
_cost_ceiling,
|
|
6986
|
+
getattr(_reap_start.spec, "type", None) if _reap_start else None,
|
|
6987
|
+
)
|
|
6988
|
+
except Exception: # noqa: BLE001 — best-effort, never break reap
|
|
6989
|
+
_spend_ceiling_reason = None
|
|
6990
|
+
|
|
6836
6991
|
# #1461: detect a usage-limit kill from the tail of the transcript.
|
|
6837
6992
|
# Done HERE — immediately after the worker's own process has exited
|
|
6838
6993
|
# and BEFORE any coordinator bookkeeping (push attempts, advisory
|
|
@@ -7103,6 +7258,13 @@ class AgentServer:
|
|
|
7103
7258
|
# checked independently of which branch set FAILED.
|
|
7104
7259
|
if _result_is_error and assignment.status == FAILED:
|
|
7105
7260
|
assignment.api_error_reason = _api_error_reason
|
|
7261
|
+
# #2131: only ever attaches to a FAILED transition —
|
|
7262
|
+
# `SPEND_CEILING_EXIT` is non-zero, so the `else` above has
|
|
7263
|
+
# already set FAILED whenever `_spend_ceiling_reason` is set.
|
|
7264
|
+
# Guarded anyway so a `POST /cancel` that raced the kill (and
|
|
7265
|
+
# set CANCELLED before this block ran) is never relabelled.
|
|
7266
|
+
if _spend_ceiling_reason is not None and assignment.status == FAILED:
|
|
7267
|
+
assignment.spend_ceiling_reason = _spend_ceiling_reason
|
|
7106
7268
|
self._processes.pop(assignment_id, None)
|
|
7107
7269
|
|
|
7108
7270
|
# #315/#324: parse the log for the worker's claude session_id (from the
|