code-coordinator 0.5.288__tar.gz → 0.5.290__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.288 → code_coordinator-0.5.290}/PKG-INFO +1 -1
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/agent.py +95 -5
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/cargo_cache.py +340 -51
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/portal.py +62 -8
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/decomposition_chat.py +21 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/cargo_targets.py +95 -12
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/portal_store.py +133 -1
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/serve_app.py +90 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cargo_cache.py +282 -1
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_portal.py +121 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_decomposition_chat.py +149 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_checks.py +90 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_fix.py +56 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_portal_store.py +212 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_sqlite_connect_ratchet.py +13 -3
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/.gitignore +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/CLAUDE.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/GOAL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/LICENSE +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/MANIFEST.in +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/README.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/__init__.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/audit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/block_log.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/board_service.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/brain.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/claim.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/cli.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/client.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/comments.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/config.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/dao.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/db.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/deps.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/drive.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/events.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/filelock.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/freshness.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/gates.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/goal.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/context.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/models.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/render.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/health/units.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/hooks.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/interactive.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/models.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/network.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/notify.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/openapi.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/parentage.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/plans.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/progress.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/release_window.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/reports.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/review.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/self_health.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/smoke.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/split_work.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/sql.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/state.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/test_author.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/test_report.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/usage.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/install-agent.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/pyproject.toml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/setup.cfg +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/__init__.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/backends.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/conftest.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_config.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_db.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_events.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_init.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_models.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_network.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_review.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_session.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_split.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_state.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tests/write_parity.py +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/types/generated.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.288 → code_coordinator-0.5.290}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -4139,6 +4139,82 @@ and report back what you asked/proposed/filed/queued/linked (and any gap) \
|
|
|
4139
4139
|
when done.\
|
|
4140
4140
|
"""
|
|
4141
4141
|
|
|
4142
|
+
# #2867: the ATTENDED posture. Appended to (never merged into)
|
|
4143
|
+
# DECOMPOSITION_CHAT_SYSTEM_PROMPT by `coord portal decompose-chat
|
|
4144
|
+
# --interactive` only — the headless dispatch
|
|
4145
|
+
# (`default_worker_command`'s `spec.type == "decomposition-chat"` branch)
|
|
4146
|
+
# must keep receiving the base prompt byte-for-byte, because it genuinely
|
|
4147
|
+
# has nobody to ask and its one-turn fire-and-forget shape is correct there.
|
|
4148
|
+
#
|
|
4149
|
+
# WHY this exists at all: #2750 shipped `--interactive` reusing the headless
|
|
4150
|
+
# prompt verbatim, so the attended session was written for an agent with
|
|
4151
|
+
# nobody to ask ("THIS iteration ends in EXACTLY ONE of three terminal
|
|
4152
|
+
# moves", each a command to run) and duly read the ledger, chose ASK, and
|
|
4153
|
+
# ran `enqueue-question` in the SAME turn — its whole output to the human
|
|
4154
|
+
# sitting there was a report of what it had already done. On a paid client
|
|
4155
|
+
# engagement where a round-trip takes days, that spent a day on questions
|
|
4156
|
+
# the operator may already have had answers to. The base prompt's
|
|
4157
|
+
# "summarize your plan before writing anything" was not enough: nothing
|
|
4158
|
+
# made it a STOP, and without a turn boundary a compliant session still
|
|
4159
|
+
# writes.
|
|
4160
|
+
DECOMPOSITION_CHAT_ATTENDED_ADDENDUM = """\
|
|
4161
|
+
|
|
4162
|
+
── ATTENDED SESSION (`--interactive`) — OVERRIDES THE ABOVE ──
|
|
4163
|
+
|
|
4164
|
+
An operator is sitting at this terminal RIGHT NOW, watching you type. That \
|
|
4165
|
+
changes the shape of this iteration, and where this section conflicts with \
|
|
4166
|
+
anything above, THIS SECTION WINS.
|
|
4167
|
+
|
|
4168
|
+
**YOUR FIRST TURN WRITES NOTHING.** Not `coord portal enqueue-question`, not \
|
|
4169
|
+
`coord portal enqueue-status`, not `coord portal decision propose/reject/\
|
|
4170
|
+
supersede`, not `coord issue create`, not `coord milestone create`, not \
|
|
4171
|
+
`coord drive-queue add`, not `coord portal link`, not `coord issue edit`. \
|
|
4172
|
+
Read-only commands (`coord portal ledger`, `gh issue view`, reading files) \
|
|
4173
|
+
are fine and expected. The "EXACTLY ONE of three terminal moves" rule above \
|
|
4174
|
+
still decides WHICH exit this iteration takes — it just does not get to \
|
|
4175
|
+
happen until the operator has answered you.
|
|
4176
|
+
|
|
4177
|
+
So your first turn is:
|
|
4178
|
+
|
|
4179
|
+
1. State your READ — the MODE line verbatim (as always), then what RUNNING \
|
|
4180
|
+
CONTEXT already tells you, explicitly including any operator-supplied \
|
|
4181
|
+
background recorded there.
|
|
4182
|
+
2. State your PROPOSED EXIT — which of Ask / Propose / Decompose you intend, \
|
|
4183
|
+
the exact command(s) you would run (question text, decision text, issue \
|
|
4184
|
+
titles), and WHY that exit and not the other two.
|
|
4185
|
+
3. State what you are ASSUMING or MISSING — above all, anything you were \
|
|
4186
|
+
about to ask the CLIENT that the OPERATOR may simply know. The operator may \
|
|
4187
|
+
have spoken to the client since the last iteration; a client round-trip \
|
|
4188
|
+
costs days and an operator answer costs one line, so ask the human in front \
|
|
4189
|
+
of you FIRST.
|
|
4190
|
+
4. END YOUR TURN AND WAIT. Do not narrate a plan and then execute it in the \
|
|
4191
|
+
same turn — the turn boundary IS the confirmation.
|
|
4192
|
+
|
|
4193
|
+
Then act on what the operator says: carry out the exit as proposed, or the \
|
|
4194
|
+
revised one they steer you to. If they confirm with no changes, run the \
|
|
4195
|
+
commands exactly as you stated them and report back. If they redirect you \
|
|
4196
|
+
into a different exit, take that one — it is still exactly one terminal \
|
|
4197
|
+
move per iteration.
|
|
4198
|
+
|
|
4199
|
+
**Recording what the operator tells you.** Background the operator relays \
|
|
4200
|
+
("I spoke to her — it's just the two of them, and the calendar is a \
|
|
4201
|
+
nice-to-have") is durable, ledger-class context that every FUTURE session on \
|
|
4202
|
+
every machine should see. It is not a decision, so do NOT push it through \
|
|
4203
|
+
`coord portal decision propose`. Record it verbatim with:
|
|
4204
|
+
|
|
4205
|
+
coord portal note <submission_id> "<what the operator told you>"
|
|
4206
|
+
|
|
4207
|
+
This is an ADDITIONAL write path you are permitted, on top of the ones the \
|
|
4208
|
+
Rules section above enumerates — and, being a write, it is also subject to \
|
|
4209
|
+
the first-turn rule: offer it, then record it once the operator agrees. \
|
|
4210
|
+
OFFER IT PROACTIVELY: the operator should not have to know this command \
|
|
4211
|
+
exists. Any time the operator gives you a substantive fact about the \
|
|
4212
|
+
client, the users, or the scope, say back what you would record and ask \
|
|
4213
|
+
whether to record it. Keep the wording theirs, not your paraphrase — the \
|
|
4214
|
+
ledger is verbatim by design, and the narrative (which is regenerable) is \
|
|
4215
|
+
where summarizing belongs.\
|
|
4216
|
+
"""
|
|
4217
|
+
|
|
4142
4218
|
# Deny list applied to decomposition-chat workers (#2533; extended #2750
|
|
4143
4219
|
# IL-4 for the ask/propose/decompose intake loop). Unlike milestone-chat,
|
|
4144
4220
|
# this type's WHOLE job is to write (issue create / issue edit / milestone
|
|
@@ -6879,11 +6955,19 @@ class AgentServer:
|
|
|
6879
6955
|
reclaimed, which is how ``cargo-target/quadraui`` reached 38G against
|
|
6880
6956
|
a 20 GiB cap and filled ``/home``.
|
|
6881
6957
|
|
|
6882
|
-
Also passes the absolute free-disk floor (#2137 item 4)
|
|
6883
|
-
|
|
6884
|
-
|
|
6885
|
-
|
|
6886
|
-
|
|
6958
|
+
Also passes the absolute free-disk floor (#2137 item 4) and, since
|
|
6959
|
+
#2919, every local checkout's own ``target/`` dir
|
|
6960
|
+
(``checkout_target_dirs``) — without this the floor can only ever
|
|
6961
|
+
reclaim from the shared cache, which is precisely the 2026-08-28
|
|
6962
|
+
incident: a stale ``~/src/quadraui/target`` sat untouched two
|
|
6963
|
+
directories away while the sweep evicted the whole cache to
|
|
6964
|
+
compensate for bytes it structurally could not reach. Mirrors
|
|
6965
|
+
``fix_cargo_targets``'s own ``_checkout_target_dirs`` in
|
|
6966
|
+
``coord/health/checks/cargo_targets.py``. Also parks the sweep's
|
|
6967
|
+
verdict where the ``cargo_targets`` health check can read it so
|
|
6968
|
+
``cargo_over_cap`` reaches an operator instead of dead-ending in this
|
|
6969
|
+
dict. Best-effort: any failure degrades to an empty dict rather than
|
|
6970
|
+
aborting the worktree sweep that calls it.
|
|
6887
6971
|
"""
|
|
6888
6972
|
with self._lock:
|
|
6889
6973
|
live_repos = {
|
|
@@ -6892,10 +6976,16 @@ class AgentServer:
|
|
|
6892
6976
|
if a.status in (PENDING, RUNNING)
|
|
6893
6977
|
}
|
|
6894
6978
|
try:
|
|
6979
|
+
from coord.health.context import local_checkouts # noqa: PLC0415
|
|
6980
|
+
|
|
6981
|
+
checkout_target_dirs = [
|
|
6982
|
+
c.path / "target" for c in local_checkouts(self._health_config)
|
|
6983
|
+
]
|
|
6895
6984
|
result = cargo_cache.sweep(
|
|
6896
6985
|
self.state_dir,
|
|
6897
6986
|
protect_repos=live_repos,
|
|
6898
6987
|
free_floor=cargo_cache.free_floor_bytes(),
|
|
6988
|
+
checkout_target_dirs=checkout_target_dirs,
|
|
6899
6989
|
)
|
|
6900
6990
|
except OSError as e: # pragma: no cover - defensive
|
|
6901
6991
|
_log.warning("cargo cache GC failed: %s", e)
|
|
@@ -54,6 +54,26 @@ agent log, and a status file (:func:`write_gc_status`) the ``cargo_targets``
|
|
|
54
54
|
health check renders — rather than returning quietly the way it did while 38G
|
|
55
55
|
accumulated.
|
|
56
56
|
|
|
57
|
+
#2919: the free-space floor above can only ever reclaim from *this* cache,
|
|
58
|
+
but on a machine where a per-checkout ``target/`` dominates the disk (a human
|
|
59
|
+
building directly in ``~/src/<repo>``, invisible to everything above), the
|
|
60
|
+
cache is not what filled the disk and evicting it whole does not fix that —
|
|
61
|
+
it just forces a fleet-wide cold rebuild that buys back, at best, an hour.
|
|
62
|
+
Two changes:
|
|
63
|
+
|
|
64
|
+
* :func:`sweep` accepts *checkout_target_dirs* — an optional list of
|
|
65
|
+
per-checkout ``target/`` paths outside the cache root entirely. When the
|
|
66
|
+
free-space floor is breached, these are reclaimed *first* (stale + idle
|
|
67
|
+
ones only, same :func:`build_active` gate), because a dir nothing has
|
|
68
|
+
touched in weeks and nothing is compiling against costs nothing to lose —
|
|
69
|
+
unlike any tier of the shared cache, which something reuses this hour.
|
|
70
|
+
* If even zeroing the *entire* cache could not close the remaining shortfall
|
|
71
|
+
(``cargo_floor_unreachable``), tier-3 whole-cache eviction is skipped: it
|
|
72
|
+
cannot satisfy the floor either way, so spending it anyway would only buy a
|
|
73
|
+
fleet-wide rebuild for nothing. The cheap tiers (1-2) still run. Either
|
|
74
|
+
way the verdict — reason, and the biggest non-cache dirs it saw — lands in
|
|
75
|
+
``cargo_over_cap_reason`` the same as an ordinary cap breach.
|
|
76
|
+
|
|
57
77
|
Set ``COORD_SHARED_CARGO_TARGET=0`` to disable the whole feature; an operator
|
|
58
78
|
who exports their own ``CARGO_TARGET_DIR`` also wins (we never override it).
|
|
59
79
|
"""
|
|
@@ -88,7 +108,18 @@ DEFAULT_CACHE_CAP_GB = 20.0
|
|
|
88
108
|
# cap can never see because the per-checkout ``target/`` dirs (17G + 13G + 11G
|
|
89
109
|
# on the machine that filled) are outside it. When free space is under this
|
|
90
110
|
# floor the sweep reclaims the shortfall from the cache even if the cache is
|
|
91
|
-
# under its cap — the cache is the cheapest thing on the disk
|
|
111
|
+
# under its cap — the cache is the cheapest thing on the disk *this module
|
|
112
|
+
# has authority over* to give up.
|
|
113
|
+
#
|
|
114
|
+
# #2919: that framing turned out to be incomplete — a single repo's cache
|
|
115
|
+
# routinely returns to 14-18G within the hour, well above this floor, so
|
|
116
|
+
# evicting it whole buys almost nothing when a stale per-checkout ``target/``
|
|
117
|
+
# dominates the disk instead. Rather than raise this number (there is no
|
|
118
|
+
# value that is both "below one repo's steady state" and "big enough to
|
|
119
|
+
# matter"), the floor path below now reaches the *actually* cheap thing
|
|
120
|
+
# first (a stale, idle per-checkout ``target/``, see ``checkout_target_dirs``
|
|
121
|
+
# on :func:`sweep`) and refuses to spend the cache on a shortfall it cannot
|
|
122
|
+
# close either way. The default stays put until that's shown insufficient.
|
|
92
123
|
DEFAULT_FREE_FLOOR_GB = 10.0
|
|
93
124
|
|
|
94
125
|
# A profile dir untouched for this long is "stale": its artifacts predate the
|
|
@@ -96,9 +127,15 @@ DEFAULT_FREE_FLOOR_GB = 10.0
|
|
|
96
127
|
# the bytes once we're over the cap.
|
|
97
128
|
DEFAULT_STALE_DAYS = 7.0
|
|
98
129
|
|
|
130
|
+
# #2919: a *per-checkout* ``target/`` may be a human's working tree they
|
|
131
|
+
# intend to return to, not just a rebuild-speed cache — so the bar for
|
|
132
|
+
# reclaiming one defaults well above a shared-cache profile dir's.
|
|
133
|
+
DEFAULT_CHECKOUT_STALE_DAYS = 30.0
|
|
134
|
+
|
|
99
135
|
CAP_ENV = "COORD_CARGO_CACHE_CAP_GB"
|
|
100
136
|
FREE_FLOOR_ENV = "COORD_CARGO_FREE_FLOOR_GB"
|
|
101
137
|
STALE_DAYS_ENV = "COORD_CARGO_STALE_DAYS"
|
|
138
|
+
CHECKOUT_STALE_DAYS_ENV = "COORD_CARGO_CHECKOUT_STALE_DAYS"
|
|
102
139
|
ENABLE_ENV = "COORD_SHARED_CARGO_TARGET"
|
|
103
140
|
CARGO_ENV = "CARGO_TARGET_DIR"
|
|
104
141
|
|
|
@@ -228,6 +265,22 @@ def stale_secs(env: dict[str, str] | None = None) -> float | None:
|
|
|
228
265
|
return days * 86400.0
|
|
229
266
|
|
|
230
267
|
|
|
268
|
+
def checkout_stale_secs(env: dict[str, str] | None = None) -> float | None:
|
|
269
|
+
"""Age at which a per-checkout ``target/`` dir counts as stale enough to
|
|
270
|
+
reclaim (#2919), or ``None`` when disabled.
|
|
271
|
+
|
|
272
|
+
Deliberately separate from :func:`stale_secs`: a *shared-cache* profile
|
|
273
|
+
dir (tier 2) is cheap to lose — cargo rebuilds just that one profile —
|
|
274
|
+
where a per-checkout ``target/`` may belong to a working tree a human
|
|
275
|
+
intends to return to, so the default bar is much higher (see
|
|
276
|
+
:data:`DEFAULT_CHECKOUT_STALE_DAYS`).
|
|
277
|
+
"""
|
|
278
|
+
days = _float_env(env, CHECKOUT_STALE_DAYS_ENV, DEFAULT_CHECKOUT_STALE_DAYS)
|
|
279
|
+
if days <= 0:
|
|
280
|
+
return None
|
|
281
|
+
return days * 86400.0
|
|
282
|
+
|
|
283
|
+
|
|
231
284
|
def dir_size(path: Path) -> int:
|
|
232
285
|
"""Total size of the regular files under *path* (symlinks not followed)."""
|
|
233
286
|
total = 0
|
|
@@ -280,6 +333,19 @@ def _last_used(path: Path) -> float:
|
|
|
280
333
|
return newest
|
|
281
334
|
|
|
282
335
|
|
|
336
|
+
def target_dir_age_secs(path: Path, now: float) -> float:
|
|
337
|
+
"""Seconds since *path* — any cargo target dir, shared cache or
|
|
338
|
+
per-checkout — was last built into (#2919).
|
|
339
|
+
|
|
340
|
+
Exposes the same cheap "newest mtime, shallow-sampled" heuristic
|
|
341
|
+
:func:`sweep`'s own tiers use internally (:func:`_last_used`), so a
|
|
342
|
+
surface with no business reaching into this module's guts — the
|
|
343
|
+
``cargo_targets`` health check reporting how stale a per-checkout
|
|
344
|
+
``target/`` is — doesn't have to re-derive it.
|
|
345
|
+
"""
|
|
346
|
+
return max(0.0, now - _last_used(path))
|
|
347
|
+
|
|
348
|
+
|
|
283
349
|
# ── #2137: intra-repo pruning ───────────────────────────────────────────────
|
|
284
350
|
|
|
285
351
|
|
|
@@ -495,6 +561,110 @@ def build_active(repo_dir: Path) -> bool:
|
|
|
495
561
|
return True
|
|
496
562
|
|
|
497
563
|
|
|
564
|
+
# ── #2919: per-checkout ``target/`` dirs, outside the cache root ───────────
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
def stale_checkout_targets(
|
|
568
|
+
dirs: "list[Path] | tuple[Path, ...]", older_than_secs: float | None, now: float
|
|
569
|
+
) -> list[Path]:
|
|
570
|
+
"""Per-checkout ``target/`` dirs idle longer than *older_than_secs*.
|
|
571
|
+
|
|
572
|
+
Unlike everything else in this module, these live outside
|
|
573
|
+
:func:`cache_root` entirely — a human's own checkout, not a per-machine
|
|
574
|
+
cache keyed on repo name — so the caller supplies the candidate paths
|
|
575
|
+
rather than this walking a known root. Purely a filter: it does not
|
|
576
|
+
check :func:`build_active`, so a caller that intends to delete anything
|
|
577
|
+
returned here still has to gate each one itself (:func:`sweep` does).
|
|
578
|
+
"""
|
|
579
|
+
if not older_than_secs or older_than_secs <= 0:
|
|
580
|
+
return []
|
|
581
|
+
out: list[Path] = []
|
|
582
|
+
for d in dirs:
|
|
583
|
+
try:
|
|
584
|
+
if d.is_symlink() or not d.is_dir():
|
|
585
|
+
continue
|
|
586
|
+
except OSError:
|
|
587
|
+
continue
|
|
588
|
+
if (now - _last_used(d)) >= older_than_secs:
|
|
589
|
+
out.append(d)
|
|
590
|
+
return out
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
def _reclaim_checkout_targets(
|
|
594
|
+
dirs: "list[Path] | tuple[Path, ...]",
|
|
595
|
+
*,
|
|
596
|
+
stale_after_secs: float | None,
|
|
597
|
+
now: float,
|
|
598
|
+
needed_bytes: int,
|
|
599
|
+
dry_run: bool,
|
|
600
|
+
result: dict,
|
|
601
|
+
) -> int:
|
|
602
|
+
"""#2919: reclaim stale, idle per-checkout ``target/`` dirs for the
|
|
603
|
+
free-space floor, stopping as soon as *needed_bytes* is covered.
|
|
604
|
+
|
|
605
|
+
Real bytes on the same filesystem the floor cares about, entirely
|
|
606
|
+
outside the cache :func:`sweep` otherwise governs — and the cheapest
|
|
607
|
+
thing on the disk to give back, because nothing has touched it in a
|
|
608
|
+
long time and (:func:`build_active`) nothing is compiling against it
|
|
609
|
+
right now. Populates ``result["cargo_checkout_*"]`` and returns bytes
|
|
610
|
+
freed (or, for a dry run, bytes that *would* be freed).
|
|
611
|
+
"""
|
|
612
|
+
# The staleness predicate is `stale_checkout_targets` — computed once,
|
|
613
|
+
# up front, rather than re-derived inline here, so there is exactly one
|
|
614
|
+
# answer to "is this checkout target stale enough to reclaim" instead of
|
|
615
|
+
# two implementations that only agree because they were written together.
|
|
616
|
+
stale_dirs = set(stale_checkout_targets(dirs, stale_after_secs, now))
|
|
617
|
+
|
|
618
|
+
scanned: list[dict] = []
|
|
619
|
+
candidates: list[tuple[float, Path, int]] = []
|
|
620
|
+
for d in dirs:
|
|
621
|
+
try:
|
|
622
|
+
if d.is_symlink() or not d.is_dir():
|
|
623
|
+
continue
|
|
624
|
+
except OSError:
|
|
625
|
+
continue
|
|
626
|
+
last_used = _last_used(d)
|
|
627
|
+
age = max(0.0, now - last_used)
|
|
628
|
+
size = dir_size(d)
|
|
629
|
+
stale = d in stale_dirs
|
|
630
|
+
scanned.append(
|
|
631
|
+
{
|
|
632
|
+
"path": str(d),
|
|
633
|
+
"bytes": size,
|
|
634
|
+
"last_used": last_used,
|
|
635
|
+
"age_secs": age,
|
|
636
|
+
"stale": stale,
|
|
637
|
+
}
|
|
638
|
+
)
|
|
639
|
+
if stale:
|
|
640
|
+
candidates.append((last_used, d, size))
|
|
641
|
+
result["cargo_checkout_scanned"] = scanned
|
|
642
|
+
|
|
643
|
+
candidates.sort(key=lambda c: (c[0], str(c[1])))
|
|
644
|
+
freed = 0
|
|
645
|
+
blocked: list[str] = []
|
|
646
|
+
pruned: list[dict] = []
|
|
647
|
+
for _last_used_at, d, size in candidates:
|
|
648
|
+
if freed >= needed_bytes:
|
|
649
|
+
break
|
|
650
|
+
if build_active(d):
|
|
651
|
+
blocked.append(str(d))
|
|
652
|
+
continue
|
|
653
|
+
if size <= 0:
|
|
654
|
+
continue
|
|
655
|
+
if not dry_run:
|
|
656
|
+
try:
|
|
657
|
+
shutil.rmtree(d)
|
|
658
|
+
except OSError:
|
|
659
|
+
continue
|
|
660
|
+
freed += size
|
|
661
|
+
pruned.append({"path": str(d), "bytes": size})
|
|
662
|
+
result["cargo_checkout_pruned"] = pruned
|
|
663
|
+
result["cargo_checkout_pruned_bytes"] = freed
|
|
664
|
+
result["cargo_checkout_prune_blocked"] = blocked
|
|
665
|
+
return freed
|
|
666
|
+
|
|
667
|
+
|
|
498
668
|
# ── #2137: the GC's verdict, for operator surfaces ──────────────────────────
|
|
499
669
|
|
|
500
670
|
|
|
@@ -544,6 +714,8 @@ def sweep(
|
|
|
544
714
|
dry_run: bool = False,
|
|
545
715
|
free_floor: int | None = None,
|
|
546
716
|
stale_after_secs: float | None = -1.0,
|
|
717
|
+
checkout_target_dirs: "list[Path] | tuple[Path, ...] | None" = None,
|
|
718
|
+
checkout_stale_after_secs: float | None = -1.0,
|
|
547
719
|
now: float | None = None,
|
|
548
720
|
) -> dict:
|
|
549
721
|
"""Reclaim cache space until the total is under the cap.
|
|
@@ -577,6 +749,19 @@ def sweep(
|
|
|
577
749
|
*stale_after_secs* defaults to the sentinel ``-1`` meaning "read it from
|
|
578
750
|
the environment" (:func:`stale_secs`); ``None`` disables tier 2.
|
|
579
751
|
|
|
752
|
+
*checkout_target_dirs* (#2919, default ``None``) names per-checkout
|
|
753
|
+
``target/`` paths on this machine, outside the cache root — the thing the
|
|
754
|
+
free-space floor could never previously reach. When the floor is
|
|
755
|
+
breached, stale + idle ones (:func:`stale_checkout_targets`,
|
|
756
|
+
:func:`build_active`) are reclaimed *before* the cache's own limit is
|
|
757
|
+
tightened, because losing one costs nothing: nothing has touched it in a
|
|
758
|
+
long time and nothing is building against it right now. If even the
|
|
759
|
+
entire cache could not have closed the remaining shortfall on its own,
|
|
760
|
+
``cargo_floor_unreachable`` is set and tier-3 whole-cache eviction is
|
|
761
|
+
skipped — it would not satisfy the floor either way, so there is no
|
|
762
|
+
reason to spend it. *checkout_stale_after_secs* is the analogous sentinel
|
|
763
|
+
for :func:`checkout_stale_secs`.
|
|
764
|
+
|
|
580
765
|
Returns ``{"cargo_cache_bytes": B, "cargo_caches_evicted": N,
|
|
581
766
|
"cargo_evicted_repos": [...], "cargo_cap_bytes": C|None,
|
|
582
767
|
"cargo_over_cap": bool, "cargo_dry_run": bool}`` plus, since #2137,
|
|
@@ -585,8 +770,16 @@ def sweep(
|
|
|
585
770
|
(repos left untouched because a build is live), ``cargo_over_cap_reason``,
|
|
586
771
|
``cargo_limit_bytes`` (what the sweep actually aimed at — the cap, or
|
|
587
772
|
tighter when the floor bites), ``cargo_disk_free_bytes``,
|
|
588
|
-
``cargo_disk_floor_bytes`` and ``cargo_disk_low``. ``
|
|
589
|
-
|
|
773
|
+
``cargo_disk_floor_bytes`` and ``cargo_disk_low``. ``cargo_disk_low`` can
|
|
774
|
+
flip back to ``False`` mid-function (#2919): it is set ``True`` as soon as
|
|
775
|
+
the floor is breached, then reset if reclaiming stale checkout
|
|
776
|
+
``target/`` dirs alone closes the shortfall, so the cache tiers below
|
|
777
|
+
never had to give anything back. ``cargo_cache_bytes`` is the total
|
|
778
|
+
*after* the sweep (or, for ``dry_run``, what it would be). Since #2919, also
|
|
779
|
+
``cargo_checkout_scanned`` (every candidate seen, with size/age/staleness),
|
|
780
|
+
``cargo_checkout_pruned``, ``cargo_checkout_pruned_bytes``,
|
|
781
|
+
``cargo_checkout_prune_blocked`` (a live build) and
|
|
782
|
+
``cargo_floor_unreachable``.
|
|
590
783
|
"""
|
|
591
784
|
limit = cap_bytes() if cap == -1 else cap
|
|
592
785
|
stale_cutoff = stale_secs() if stale_after_secs == -1.0 else stale_after_secs
|
|
@@ -612,6 +805,12 @@ def sweep(
|
|
|
612
805
|
"cargo_disk_free_bytes": None,
|
|
613
806
|
"cargo_disk_floor_bytes": free_floor,
|
|
614
807
|
"cargo_disk_low": False,
|
|
808
|
+
# #2919.
|
|
809
|
+
"cargo_checkout_scanned": [],
|
|
810
|
+
"cargo_checkout_pruned": [],
|
|
811
|
+
"cargo_checkout_pruned_bytes": 0,
|
|
812
|
+
"cargo_checkout_prune_blocked": [],
|
|
813
|
+
"cargo_floor_unreachable": False,
|
|
615
814
|
}
|
|
616
815
|
|
|
617
816
|
root = cache_root(state_dir)
|
|
@@ -637,7 +836,7 @@ def sweep(
|
|
|
637
836
|
# #2137 item 4: the failure that actually bit was "0 bytes free", not
|
|
638
837
|
# "cache over cap". A floor on absolute free space tightens the limit so
|
|
639
838
|
# the cache gives back the shortfall — it is the cheapest thing on the
|
|
640
|
-
# filesystem
|
|
839
|
+
# filesystem *this module has authority over* to lose.
|
|
641
840
|
if free_floor:
|
|
642
841
|
try:
|
|
643
842
|
usage = shutil.disk_usage(str(root))
|
|
@@ -648,11 +847,48 @@ def sweep(
|
|
|
648
847
|
shortfall = free_floor - usage.free
|
|
649
848
|
if shortfall > 0:
|
|
650
849
|
result["cargo_disk_low"] = True
|
|
651
|
-
disk_limit = max(0, total - shortfall)
|
|
652
|
-
limit = disk_limit if limit is None else min(limit, disk_limit)
|
|
653
|
-
result["cargo_limit_bytes"] = limit
|
|
654
850
|
|
|
655
|
-
|
|
851
|
+
# #2919: reclaim stale, idle per-checkout target/ dirs
|
|
852
|
+
# first — real bytes on this same filesystem, entirely
|
|
853
|
+
# outside the cache, and cheaper to lose than anything in
|
|
854
|
+
# it: nothing has touched them in a long time and nothing
|
|
855
|
+
# is building against them right now.
|
|
856
|
+
if checkout_target_dirs:
|
|
857
|
+
checkout_cutoff = (
|
|
858
|
+
checkout_stale_secs()
|
|
859
|
+
if checkout_stale_after_secs == -1.0
|
|
860
|
+
else checkout_stale_after_secs
|
|
861
|
+
)
|
|
862
|
+
shortfall -= _reclaim_checkout_targets(
|
|
863
|
+
checkout_target_dirs,
|
|
864
|
+
stale_after_secs=checkout_cutoff,
|
|
865
|
+
now=clock,
|
|
866
|
+
needed_bytes=shortfall,
|
|
867
|
+
dry_run=dry_run,
|
|
868
|
+
result=result,
|
|
869
|
+
)
|
|
870
|
+
|
|
871
|
+
if shortfall <= 0:
|
|
872
|
+
# The non-cache tier closed the gap on its own — the
|
|
873
|
+
# cache is not touched at all.
|
|
874
|
+
result["cargo_disk_low"] = False
|
|
875
|
+
else:
|
|
876
|
+
if shortfall >= total:
|
|
877
|
+
# #2919: even zeroing the ENTIRE cache would not
|
|
878
|
+
# close this gap. Escalating to tier-3 eviction
|
|
879
|
+
# below would buy a fleet-wide cold rebuild for
|
|
880
|
+
# nothing, so it is skipped and the sweep says why.
|
|
881
|
+
result["cargo_floor_unreachable"] = True
|
|
882
|
+
disk_limit = max(0, total - shortfall)
|
|
883
|
+
limit = disk_limit if limit is None else min(limit, disk_limit)
|
|
884
|
+
result["cargo_limit_bytes"] = limit
|
|
885
|
+
|
|
886
|
+
if limit is None:
|
|
887
|
+
# GC disabled entirely. Note this cannot skip the floor-unreachable
|
|
888
|
+
# reason/log below: `limit` only stays `None` here when the free-disk
|
|
889
|
+
# floor never set `disk_limit` in the first place (see the
|
|
890
|
+
# `if free_floor:` block above), which means `cargo_floor_unreachable`
|
|
891
|
+
# is `False` too — there is nothing for this early return to lose.
|
|
656
892
|
return result
|
|
657
893
|
|
|
658
894
|
# Oldest-used first; ties broken by name so the sweep is deterministic.
|
|
@@ -660,6 +896,7 @@ def sweep(
|
|
|
660
896
|
remaining = {name: size for _m, name, _p, size in entries}
|
|
661
897
|
pruned: list[dict] = []
|
|
662
898
|
blocked: list[str] = []
|
|
899
|
+
evicted: list[str] = []
|
|
663
900
|
# A repo's build-activity verdict is probed at most once per sweep: the
|
|
664
901
|
# /proc scan is not free and the answer cannot usefully change mid-sweep.
|
|
665
902
|
idle: dict[str, bool] = {}
|
|
@@ -697,49 +934,64 @@ def sweep(
|
|
|
697
934
|
)
|
|
698
935
|
return size
|
|
699
936
|
|
|
700
|
-
#
|
|
701
|
-
#
|
|
702
|
-
#
|
|
703
|
-
#
|
|
704
|
-
|
|
705
|
-
|
|
937
|
+
# Everything below is the reclaim work itself, skipped outright when the
|
|
938
|
+
# cache is already at/under the limit (including the common post-#2919
|
|
939
|
+
# case of a prior sweep having already drained it to 0) — but the
|
|
940
|
+
# aggregation and floor-unreachable/over-cap reporting after it always
|
|
941
|
+
# runs, even then: `cargo_floor_unreachable` can be `True` with nothing
|
|
942
|
+
# left here to reclaim, and that verdict must still reach
|
|
943
|
+
# `cargo_over_cap_reason` and the log rather than being lost to an early
|
|
944
|
+
# return, which was the bug (#2919 review).
|
|
945
|
+
if total > limit:
|
|
946
|
+
# Tier 1 then tier 2, each across every repo before the next
|
|
947
|
+
# escalates — "cheapest to recreate first" is a property of the whole
|
|
948
|
+
# cache, not of one repo, so an incremental dir on a hot repo goes
|
|
949
|
+
# before a stale profile dir on a cold one.
|
|
950
|
+
for tier in ("incremental", "stale"):
|
|
951
|
+
for _mtime, name, path, _size in entries:
|
|
952
|
+
if total <= limit:
|
|
953
|
+
break
|
|
954
|
+
if not _may_touch(name, path):
|
|
955
|
+
continue
|
|
956
|
+
if tier == "incremental":
|
|
957
|
+
subtrees = incremental_dirs(path)
|
|
958
|
+
elif stale_cutoff is None:
|
|
959
|
+
subtrees = []
|
|
960
|
+
else:
|
|
961
|
+
subtrees = stale_profile_dirs(path, stale_cutoff, clock)
|
|
962
|
+
for subtree in subtrees:
|
|
963
|
+
if total <= limit:
|
|
964
|
+
break
|
|
965
|
+
total -= _reclaim(name, subtree, tier)
|
|
706
966
|
if total <= limit:
|
|
707
967
|
break
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
968
|
+
|
|
969
|
+
# Tier 3: whole-directory eviction, as since #1402 — the last resort,
|
|
970
|
+
# and never against a repo with a live assignment. The
|
|
971
|
+
# build-activity gate applies here too: refusing to prune a busy tree
|
|
972
|
+
# and then rmtree-ing the whole thing two lines later would be the
|
|
973
|
+
# worse of both behaviours.
|
|
974
|
+
#
|
|
975
|
+
# #2919: skipped entirely when the free-space floor is unreachable
|
|
976
|
+
# from the cache alone — spending the whole cache would not close
|
|
977
|
+
# that gap either, so there is nothing to buy by evicting it, only a
|
|
978
|
+
# fleet-wide cold rebuild to pay for.
|
|
979
|
+
if not result["cargo_floor_unreachable"]:
|
|
980
|
+
for _mtime, name, path, _size in entries:
|
|
717
981
|
if total <= limit:
|
|
718
982
|
break
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
if name in protected:
|
|
732
|
-
continue
|
|
733
|
-
if not _may_touch(name, path):
|
|
734
|
-
continue
|
|
735
|
-
if not dry_run:
|
|
736
|
-
try:
|
|
737
|
-
shutil.rmtree(path)
|
|
738
|
-
except OSError:
|
|
739
|
-
continue
|
|
740
|
-
total -= remaining[name]
|
|
741
|
-
remaining[name] = 0
|
|
742
|
-
evicted.append(name)
|
|
983
|
+
if name in protected:
|
|
984
|
+
continue
|
|
985
|
+
if not _may_touch(name, path):
|
|
986
|
+
continue
|
|
987
|
+
if not dry_run:
|
|
988
|
+
try:
|
|
989
|
+
shutil.rmtree(path)
|
|
990
|
+
except OSError:
|
|
991
|
+
continue
|
|
992
|
+
total -= remaining[name]
|
|
993
|
+
remaining[name] = 0
|
|
994
|
+
evicted.append(name)
|
|
743
995
|
|
|
744
996
|
pruned_bytes = sum(int(p["bytes"]) for p in pruned)
|
|
745
997
|
result["cargo_cache_bytes"] = total
|
|
@@ -751,7 +1003,21 @@ def sweep(
|
|
|
751
1003
|
result["cargo_prune_blocked"] = blocked
|
|
752
1004
|
result["cargo_over_cap"] = total > limit
|
|
753
1005
|
|
|
754
|
-
if result["
|
|
1006
|
+
if result["cargo_floor_unreachable"]:
|
|
1007
|
+
# Independent of `cargo_over_cap` below: this is true — and worth
|
|
1008
|
+
# saying — even if tiers 1-2 happened to drain the cache to 0 and
|
|
1009
|
+
# `cargo_over_cap` ends up False.
|
|
1010
|
+
reason = _over_cap_reason(
|
|
1011
|
+
total,
|
|
1012
|
+
limit,
|
|
1013
|
+
floor_unreachable=True,
|
|
1014
|
+
top_consumers=result.get("cargo_checkout_scanned"),
|
|
1015
|
+
)
|
|
1016
|
+
result["cargo_over_cap_reason"] = reason
|
|
1017
|
+
_log.warning(
|
|
1018
|
+
"cargo free-space floor unreachable from the cache alone: %s", reason
|
|
1019
|
+
)
|
|
1020
|
+
elif result["cargo_over_cap"]:
|
|
755
1021
|
reason = _over_cap_reason(total, limit, protected, blocked, remaining)
|
|
756
1022
|
result["cargo_over_cap_reason"] = reason
|
|
757
1023
|
# Escalate rather than return quietly (#2137): this is the exact state
|
|
@@ -763,12 +1029,35 @@ def sweep(
|
|
|
763
1029
|
def _over_cap_reason(
|
|
764
1030
|
total: int,
|
|
765
1031
|
limit: int,
|
|
766
|
-
protected: "set[str]",
|
|
767
|
-
blocked: "list[str]",
|
|
768
|
-
remaining: dict[str, int],
|
|
1032
|
+
protected: "set[str] | None" = None,
|
|
1033
|
+
blocked: "list[str] | None" = None,
|
|
1034
|
+
remaining: "dict[str, int] | None" = None,
|
|
1035
|
+
*,
|
|
1036
|
+
floor_unreachable: bool = False,
|
|
1037
|
+
top_consumers: "list[dict] | None" = None,
|
|
769
1038
|
) -> str:
|
|
770
1039
|
"""One line an operator can act on: how far over, and what stopped us."""
|
|
1040
|
+
if floor_unreachable:
|
|
1041
|
+
ranked = sorted(
|
|
1042
|
+
(c for c in (top_consumers or []) if c.get("bytes")),
|
|
1043
|
+
key=lambda c: -int(c["bytes"]),
|
|
1044
|
+
)[:3]
|
|
1045
|
+
names = ", ".join(
|
|
1046
|
+
f"{c['path']} {_human(int(c['bytes']))} ({c['age_secs'] / 86400:.0f}d idle)"
|
|
1047
|
+
for c in ranked
|
|
1048
|
+
)
|
|
1049
|
+
detail = f"top non-cache consumers: {names}" if names else (
|
|
1050
|
+
"no non-cache target dirs were passed in to check"
|
|
1051
|
+
)
|
|
1052
|
+
return (
|
|
1053
|
+
f"{_human(total)} cache cannot cover the free-space shortfall on its "
|
|
1054
|
+
f"own — evicting it would not resolve this, so it was left alone; "
|
|
1055
|
+
f"{detail}"
|
|
1056
|
+
)
|
|
771
1057
|
over = _human(total - limit)
|
|
1058
|
+
blocked = blocked or []
|
|
1059
|
+
protected = protected or set()
|
|
1060
|
+
remaining = remaining or {}
|
|
772
1061
|
if blocked:
|
|
773
1062
|
why = f"live build in {', '.join(sorted(blocked))}"
|
|
774
1063
|
elif protected:
|