code-coordinator 0.5.311__tar.gz → 0.5.313__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.311 → code_coordinator-0.5.313}/PKG-INFO +1 -1
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/lifecycle.py +13 -1
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/release.py +23 -1
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/tui.py +19 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/confirm_test.py +131 -3
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/housekeeping.py +26 -5
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/serve_app.py +7 -2
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/tui_release.py +40 -4
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_cap_762.py +27 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_release_propagate.py +137 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_tui_update.py +31 -4
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_confirm_test.py +153 -6
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.gitignore +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/CLAUDE.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/GOAL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/LICENSE +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/MANIFEST.in +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/README.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/__init__.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agent.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/audit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/block_log.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/board_service.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/brain.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/claim.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/cli.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/client.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/comments.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/config.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dao.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/db.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deps.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/drive.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/events.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/filelock.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/freshness.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/gates.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/goal.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/context.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/models.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/render.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/units.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/hooks.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/interactive.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/models.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/network.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notify.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/openapi.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/parentage.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/plans.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/progress.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/release_window.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/reports.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/review.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/self_health.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/smoke.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/split_work.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/sql.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/state.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/test_author.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/test_report.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/usage.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/install-agent.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/pyproject.toml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/setup.cfg +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/__init__.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/backends.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/conftest.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_db.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_events.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_init.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_models.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_network.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_session.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_split.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_state.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/write_parity.py +0 -0
|
@@ -24,7 +24,13 @@ def _print_housekeeping_result(resp: dict) -> None:
|
|
|
24
24
|
archived_a = resp.get("archived_assignments", 0)
|
|
25
25
|
archived_n = resp.get("archived_notifications", 0)
|
|
26
26
|
days = resp.get("retention_days")
|
|
27
|
-
|
|
27
|
+
# #2974: the confirm-worktree sweep runs on its own age window,
|
|
28
|
+
# independent of `retention_days` above, and must be reported even when
|
|
29
|
+
# there was nothing terminal to archive — that used to be the ONLY thing
|
|
30
|
+
# this sweep did, so a run that only reclaimed leaked worktrees must not
|
|
31
|
+
# print "nothing to archive" and hide it.
|
|
32
|
+
removed_wt = resp.get("removed_confirm_worktrees", 0)
|
|
33
|
+
if not archived_a and not archived_n and not removed_wt:
|
|
28
34
|
click.echo(
|
|
29
35
|
f"housekeeping: nothing to archive (no terminal rows older than {days}d)."
|
|
30
36
|
)
|
|
@@ -35,6 +41,12 @@ def _print_housekeeping_result(resp: dict) -> None:
|
|
|
35
41
|
f"housekeeping: {verb} {archived_a} assignment(s) + "
|
|
36
42
|
f"{archived_n} notification(s) (terminal, older than {days}d).{suffix}"
|
|
37
43
|
)
|
|
44
|
+
if removed_wt:
|
|
45
|
+
wt_verb = "would remove" if dry else "removed"
|
|
46
|
+
click.echo(
|
|
47
|
+
f"housekeeping: {wt_verb} {removed_wt} stale confirm-worktree(s) "
|
|
48
|
+
"(#2974)."
|
|
49
|
+
)
|
|
38
50
|
|
|
39
51
|
|
|
40
52
|
@click.command(
|
|
@@ -2319,10 +2319,26 @@ def _roll_tui(machine, *, local_name: str | None) -> tuple[bool | None, str]:
|
|
|
2319
2319
|
(:func:`coord.tui_release.fetch_latest_release_tag`) — that is the
|
|
2320
2320
|
:data:`~coord.release_propagate.CHANNEL_TUI` channel doing its own version
|
|
2321
2321
|
selection, not this run guessing across a channel boundary.
|
|
2322
|
+
|
|
2323
|
+
#2981 — AN EMPTY CHANNEL IS NOT A FAILED ROLL.
|
|
2324
|
+
A channel with zero releases/tags 404s on every ``coord tui update``
|
|
2325
|
+
forever, until someone cuts a first release — that is a fact about
|
|
2326
|
+
``coord-tui``'s Releases, not about whatever this host just attempted.
|
|
2327
|
+
``coord tui update`` exits :data:`~coord.commands.tui.EXIT_EMPTY_CHANNEL`
|
|
2328
|
+
specifically for that case (``EmptyReleaseChannelError``, raised at the
|
|
2329
|
+
source in :func:`coord.tui_release.fetch_latest_release_tag`), so this
|
|
2330
|
+
reads that exact exit code and returns ``ok=None`` — the same "no channel
|
|
2331
|
+
to roll" treatment already given to a remote host above, which
|
|
2332
|
+
:func:`coord.release_propagate.scope_verification` excludes from the
|
|
2333
|
+
gate that ``--rollback-on-red`` acts on. A *genuine* failure (a real
|
|
2334
|
+
release exists but the asset/checksum/install step fails) still exits
|
|
2335
|
+
``1`` here and stays ``ok=False`` — still blocking, still eligible to
|
|
2336
|
+
trigger a rollback.
|
|
2322
2337
|
"""
|
|
2323
2338
|
import subprocess # noqa: PLC0415
|
|
2324
2339
|
|
|
2325
2340
|
from coord import release_propagate as rp # noqa: PLC0415
|
|
2341
|
+
from coord.commands.tui import EXIT_EMPTY_CHANNEL # noqa: PLC0415
|
|
2326
2342
|
|
|
2327
2343
|
if local_name is None or machine.name != local_name:
|
|
2328
2344
|
return None, (
|
|
@@ -2343,7 +2359,13 @@ def _roll_tui(machine, *, local_name: str | None) -> tuple[bool | None, str]:
|
|
|
2343
2359
|
if installed
|
|
2344
2360
|
else f"coord-tui updated from the {rp.CHANNEL_TUI} channel"
|
|
2345
2361
|
)
|
|
2346
|
-
|
|
2362
|
+
detail = (proc.stderr or proc.stdout or f"exit {proc.returncode}").strip()[:300]
|
|
2363
|
+
if proc.returncode == EXIT_EMPTY_CHANNEL:
|
|
2364
|
+
return None, (
|
|
2365
|
+
f"{rp.CHANNEL_TUI} channel has no published release yet — "
|
|
2366
|
+
f"nothing to install, not a roll failure (#2981): {detail}"
|
|
2367
|
+
)
|
|
2368
|
+
return False, detail
|
|
2347
2369
|
|
|
2348
2370
|
|
|
2349
2371
|
def _installed_tui_version(stdout: str) -> str | None:
|
|
@@ -49,6 +49,7 @@ from coord.tui_release import (
|
|
|
49
49
|
DEFAULT_INSTALL_PATH,
|
|
50
50
|
DEFAULT_REPO,
|
|
51
51
|
DEV_BUILD_SENTINEL_VERSION,
|
|
52
|
+
EmptyReleaseChannelError,
|
|
52
53
|
ReleaseAssetNotFoundError,
|
|
53
54
|
UnsupportedPlatformError,
|
|
54
55
|
detect_target,
|
|
@@ -63,6 +64,15 @@ from coord.tui_release import (
|
|
|
63
64
|
sha256_file,
|
|
64
65
|
)
|
|
65
66
|
|
|
67
|
+
#: `tui update`'s exit code when the channel has never published a release
|
|
68
|
+
#: (#2981) — distinct from the generic ``1`` used for every other failure so
|
|
69
|
+
#: `coord/commands/release.py`'s `_roll_tui` can tell "nothing to install
|
|
70
|
+
#: yet" apart from "the roll actually failed" by exit code alone, with no
|
|
71
|
+
#: string-matching of the error message. Kept here (not in `tui_release.py`)
|
|
72
|
+
#: because it is a detail of *this command's* process-exit contract, the
|
|
73
|
+
#: same reason `3` (the dev-build refusal below) lives here too.
|
|
74
|
+
EXIT_EMPTY_CHANNEL = 4
|
|
75
|
+
|
|
66
76
|
|
|
67
77
|
def _dest_path(dest: str | None) -> Path:
|
|
68
78
|
return Path(dest).expanduser() if dest else Path(DEFAULT_INSTALL_PATH).expanduser()
|
|
@@ -310,6 +320,15 @@ def tui_update(
|
|
|
310
320
|
target_version = fetch_latest_release_tag(
|
|
311
321
|
repo=repo, api_base=api_base, timeout=timeout
|
|
312
322
|
)
|
|
323
|
+
except EmptyReleaseChannelError as exc:
|
|
324
|
+
# #2981: this channel has never published a release -- there is
|
|
325
|
+
# nothing to install, but that is a fact about the CHANNEL, not
|
|
326
|
+
# evidence that this run's attempt failed. A distinct exit code
|
|
327
|
+
# (rather than the generic `1` below) lets a caller such as
|
|
328
|
+
# `coord release propagate` grade the two differently without
|
|
329
|
+
# parsing this message.
|
|
330
|
+
click.echo(f"error: {exc}", err=True)
|
|
331
|
+
sys.exit(EXIT_EMPTY_CHANNEL)
|
|
313
332
|
except Exception as exc: # noqa: BLE001 -- surface any network/HTTP failure plainly
|
|
314
333
|
click.echo(
|
|
315
334
|
f"error: could not resolve coord-tui's latest release from "
|
|
@@ -104,6 +104,7 @@ existed.
|
|
|
104
104
|
from __future__ import annotations
|
|
105
105
|
|
|
106
106
|
import os
|
|
107
|
+
import shutil
|
|
107
108
|
import subprocess
|
|
108
109
|
import threading
|
|
109
110
|
import time
|
|
@@ -484,6 +485,106 @@ def confirm_lock_path(repo_name: str, branch: str) -> Path:
|
|
|
484
485
|
return COORD_DIR / "confirm-worktrees" / f"{safe}.lock"
|
|
485
486
|
|
|
486
487
|
|
|
488
|
+
#: #2974: default age (hours) a directory under ``confirm-worktrees/`` may sit
|
|
489
|
+
#: unremoved before :func:`sweep_stale_confirm_worktrees` reclaims it outright.
|
|
490
|
+
#: Every entry under that root is throwaway by construction (#561) and
|
|
491
|
+
#: `confirm_branch`'s own `finally` now removes its worktree on every exit —
|
|
492
|
+
#: so anything still here this long survived something worse than an ordinary
|
|
493
|
+
#: failure (a hard kill of the whole process, `coord-agent`/`coord-serve`
|
|
494
|
+
#: restarting mid-run before #2974's `finally` fix ever ran, a full disk
|
|
495
|
+
#: mid-cleanup). Generous relative to :data:`CONFIRM_DEFAULT_TIMEOUT_SECONDS`
|
|
496
|
+
#: (20 min) so this never races a confirmation that is still legitimately
|
|
497
|
+
#: in flight.
|
|
498
|
+
#:
|
|
499
|
+
#: Footgun to remember if either ceiling ever moves: the margin here is
|
|
500
|
+
#: relative, not enforced. `sweep_stale_confirm_worktrees` doesn't know
|
|
501
|
+
#: whether a given `confirm-worktrees/<repo>-<branch>` entry has a
|
|
502
|
+
#: `confirm_branch` call still running against it — it reclaims purely on
|
|
503
|
+
#: directory mtime. If `CONFIRM_DEFAULT_TIMEOUT_SECONDS` (or a future
|
|
504
|
+
#: per-repo override of it) is ever raised to within a few hours of this
|
|
505
|
+
#: constant, a still-in-flight confirmation's worktree (and its `.lock`
|
|
506
|
+
#: file) could be `rmtree`'d out from under it by this sweep. Keep this
|
|
507
|
+
#: comfortably above whatever the longest configured confirmation timeout
|
|
508
|
+
#: is, not just the current default.
|
|
509
|
+
STALE_WORKTREE_MAX_AGE_HOURS = 6.0
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
def sweep_stale_confirm_worktrees(
|
|
513
|
+
*,
|
|
514
|
+
max_age_hours: float = STALE_WORKTREE_MAX_AGE_HOURS,
|
|
515
|
+
dry_run: bool = False,
|
|
516
|
+
now: float | None = None,
|
|
517
|
+
) -> dict:
|
|
518
|
+
"""Reclaim ``confirm-worktrees/`` entries older than *max_age_hours* (#2974).
|
|
519
|
+
|
|
520
|
+
Belt-and-suspenders over the `finally`-based cleanup in
|
|
521
|
+
:func:`confirm_branch`: that fix stops the leak going forward, but does
|
|
522
|
+
nothing about the hundreds of directories (189G measured on one host,
|
|
523
|
+
#2974) a build that never reaches this fix — or any future bug in the
|
|
524
|
+
cleanup path itself — can still leave behind. This sweep is the backstop
|
|
525
|
+
that ages them out regardless of cause.
|
|
526
|
+
|
|
527
|
+
Deliberately filesystem-only: it reclaims disk with a plain
|
|
528
|
+
``shutil.rmtree`` keyed on directory mtime, and does **not** attempt a
|
|
529
|
+
``git worktree prune`` in the originating repo's checkout (that would
|
|
530
|
+
need to map each ``<repo>-<branch>`` directory name back to a configured
|
|
531
|
+
repo, which is ambiguous when a repo or branch name itself contains a
|
|
532
|
+
``-``). The admin metadata that leaves behind in the base checkout's
|
|
533
|
+
``.git/worktrees/`` is a few KB per entry — negligible next to the build
|
|
534
|
+
trees this reclaims — and self-heals the next time :func:`confirm_branch`
|
|
535
|
+
or :func:`coord.revalidate.revalidate` runs `git worktree prune` for that
|
|
536
|
+
repo anyway.
|
|
537
|
+
|
|
538
|
+
Called from :func:`coord.housekeeping.sweep`'s existing low-cadence
|
|
539
|
+
daemon tick and ``coord housekeeping``, so it needs no new wiring or
|
|
540
|
+
schedule of its own. Returns
|
|
541
|
+
``{"removed": [names], "dry_run": bool, "max_age_hours": float}`` —
|
|
542
|
+
``removed`` lists what was (or, for ``dry_run``, would be) deleted.
|
|
543
|
+
Silently a no-op if the directory does not exist yet.
|
|
544
|
+
"""
|
|
545
|
+
from coord.state import COORD_DIR # noqa: PLC0415
|
|
546
|
+
|
|
547
|
+
root = COORD_DIR / "confirm-worktrees"
|
|
548
|
+
result: dict = {
|
|
549
|
+
"removed": [],
|
|
550
|
+
"dry_run": dry_run,
|
|
551
|
+
"max_age_hours": max_age_hours,
|
|
552
|
+
}
|
|
553
|
+
if not root.exists():
|
|
554
|
+
return result
|
|
555
|
+
|
|
556
|
+
cutoff = (now if now is not None else time.time()) - max_age_hours * 3600.0
|
|
557
|
+
try:
|
|
558
|
+
entries = sorted(root.iterdir())
|
|
559
|
+
except OSError:
|
|
560
|
+
return result
|
|
561
|
+
|
|
562
|
+
for entry in entries:
|
|
563
|
+
# Lock files (`confirm_lock_path`) are tiny and self-explanatory by
|
|
564
|
+
# name; only the worktree directories themselves are the disk cost
|
|
565
|
+
# this sweep exists to reclaim. A stray lock with no matching
|
|
566
|
+
# worktree directory is harmless — the next `confirm_branch` call for
|
|
567
|
+
# that (repo, branch) simply re-creates and re-locks it.
|
|
568
|
+
if entry.name.endswith(".lock") or not entry.is_dir():
|
|
569
|
+
continue
|
|
570
|
+
try:
|
|
571
|
+
mtime = entry.stat().st_mtime
|
|
572
|
+
except OSError:
|
|
573
|
+
continue
|
|
574
|
+
if mtime >= cutoff:
|
|
575
|
+
continue
|
|
576
|
+
result["removed"].append(entry.name)
|
|
577
|
+
if dry_run:
|
|
578
|
+
continue
|
|
579
|
+
shutil.rmtree(entry, ignore_errors=True)
|
|
580
|
+
lock_path = root / f"{entry.name}.lock"
|
|
581
|
+
try:
|
|
582
|
+
lock_path.unlink(missing_ok=True)
|
|
583
|
+
except OSError:
|
|
584
|
+
pass
|
|
585
|
+
return result
|
|
586
|
+
|
|
587
|
+
|
|
487
588
|
def branch_touched_files(repo_dir: Path, branch: str, base_branch: str) -> list[str]:
|
|
488
589
|
"""Paths the branch changes vs its merge-base with *base_branch*.
|
|
489
590
|
|
|
@@ -915,9 +1016,9 @@ def confirm_branch(
|
|
|
915
1016
|
test_command,
|
|
916
1017
|
)
|
|
917
1018
|
|
|
918
|
-
# Green, and observed rather than reported.
|
|
919
|
-
#
|
|
920
|
-
|
|
1019
|
+
# Green, and observed rather than reported. Nothing to inspect —
|
|
1020
|
+
# cleanup happens in `finally` below, same as every other exit from
|
|
1021
|
+
# this block.
|
|
921
1022
|
return ConfirmationResult(
|
|
922
1023
|
kind=KIND_OK,
|
|
923
1024
|
reason=(
|
|
@@ -928,6 +1029,31 @@ def confirm_branch(
|
|
|
928
1029
|
returncode=0,
|
|
929
1030
|
)
|
|
930
1031
|
finally:
|
|
1032
|
+
# #2974: EVERY exit from the block above — including KIND_TIMEOUT
|
|
1033
|
+
# (a hung/slow suite), KIND_SIGNAL (a coord-agent/coord-serve restart
|
|
1034
|
+
# landing mid-run, #2527), and a genuine refutation (KIND_BUILD/
|
|
1035
|
+
# KIND_SUITE) — must remove this worktree, not just the green path.
|
|
1036
|
+
#
|
|
1037
|
+
# `coord.revalidate`'s sibling helper deliberately KEEPS a failed
|
|
1038
|
+
# worktree "for inspection" (see its `_remove_worktree` docstring and
|
|
1039
|
+
# `format_failure`'s "worktree kept for inspection" line) because
|
|
1040
|
+
# `coord merge --revalidate` is opt-in, operator-initiated, and rare —
|
|
1041
|
+
# a human is watching and can go look at the tree it names.
|
|
1042
|
+
# `confirm_branch` is the opposite shape: it runs unattended, on every
|
|
1043
|
+
# PASS claim, inside the automatic reap path, keyed by (repo, branch)
|
|
1044
|
+
# — and a branch is rarely revisited, so nothing was ever going to
|
|
1045
|
+
# remove a "kept for inspection" tree here. That is exactly how this
|
|
1046
|
+
# leaked to 189G / 346 dirs on one host in nine days (#2974): the
|
|
1047
|
+
# biggest trees came from the slowest repos, i.e. precisely the
|
|
1048
|
+
# KIND_TIMEOUT/KIND_SIGNAL runs that used to fall through this
|
|
1049
|
+
# `finally` without cleanup.
|
|
1050
|
+
#
|
|
1051
|
+
# Nothing of diagnostic value is lost: the captured output tail
|
|
1052
|
+
# (`ConfirmationResult.output`) is already persisted to
|
|
1053
|
+
# `test_output/<assignment_id>.txt` by `write_confirmation_output`
|
|
1054
|
+
# regardless of outcome — the worktree itself was never the thing an
|
|
1055
|
+
# operator actually inspected.
|
|
1056
|
+
_remove_worktree(repo_dir, wt_path)
|
|
931
1057
|
lock.release()
|
|
932
1058
|
|
|
933
1059
|
|
|
@@ -942,6 +1068,7 @@ __all__ = [
|
|
|
942
1068
|
"NOTIFY_BASE_CLIENT_TIMEOUT_SECONDS",
|
|
943
1069
|
"PERMISSION_DENIED_EXIT",
|
|
944
1070
|
"REFUTING_KINDS",
|
|
1071
|
+
"STALE_WORKTREE_MAX_AGE_HOURS",
|
|
945
1072
|
"ConfirmationResult",
|
|
946
1073
|
"begin_confirmation_pass",
|
|
947
1074
|
"branch_touched_files",
|
|
@@ -952,6 +1079,7 @@ __all__ = [
|
|
|
952
1079
|
"confirmation_timeout",
|
|
953
1080
|
"notify_client_timeout_seconds",
|
|
954
1081
|
"spend_confirmation_budget",
|
|
1082
|
+
"sweep_stale_confirm_worktrees",
|
|
955
1083
|
"unmet_confirmation_capabilities",
|
|
956
1084
|
"write_confirmation_output",
|
|
957
1085
|
]
|
|
@@ -33,6 +33,14 @@ declog. ``coord.merge_queue.merged_issue_keys()`` unions the live table with
|
|
|
33
33
|
the archive so the "already merged, don't re-enqueue" dedup in
|
|
34
34
|
``enqueue_approved_work``/``staging_items`` keeps working after a row ages
|
|
35
35
|
out.
|
|
36
|
+
|
|
37
|
+
#2974: this is also the one existing low-cadence, filesystem-safe hook the
|
|
38
|
+
daemon already calls on a timer (and that ``coord housekeeping`` calls on
|
|
39
|
+
demand) — so it is where :func:`coord.confirm_test.sweep_stale_confirm_worktrees`
|
|
40
|
+
is wired in too, reclaiming ``~/.coord/confirm-worktrees/`` entries that
|
|
41
|
+
outlived ``confirm_branch``'s own per-run cleanup. That is disk hygiene, not
|
|
42
|
+
DB archiving, but reusing this sweep's cadence beats inventing a second timer
|
|
43
|
+
for a second maintenance job.
|
|
36
44
|
"""
|
|
37
45
|
|
|
38
46
|
from __future__ import annotations
|
|
@@ -140,12 +148,13 @@ def _move_rows(
|
|
|
140
148
|
|
|
141
149
|
def sweep(*, dry_run: bool = False, now: float | None = None) -> dict:
|
|
142
150
|
"""Archive stale terminal assignments + their notifications + merged
|
|
143
|
-
merge_queue entries.
|
|
151
|
+
merge_queue entries, and reclaim leaked confirm-worktree directories.
|
|
144
152
|
|
|
145
153
|
Returns ``{"archived_assignments": N, "archived_notifications": M,
|
|
146
|
-
"archived_merge_queue": K, "
|
|
147
|
-
``archived_
|
|
148
|
-
moved. A
|
|
154
|
+
"archived_merge_queue": K, "removed_confirm_worktrees": W, "dry_run": bool,
|
|
155
|
+
"retention_days": D}``. ``archived_*``/``removed_confirm_worktrees`` are
|
|
156
|
+
the counts that were (or, for ``dry_run``, would be) moved/deleted. A
|
|
157
|
+
no-op returns zeros.
|
|
149
158
|
|
|
150
159
|
Conservative by construction: nothing active, recent (within the archive
|
|
151
160
|
window), queued-for-merge, latest-of-an-open-issue, or review-linked to any
|
|
@@ -153,17 +162,29 @@ def sweep(*, dry_run: bool = False, now: float | None = None) -> dict:
|
|
|
153
162
|
are in the terminal ``MERGED`` state (#1107 Part 3) — non-terminal /
|
|
154
163
|
conflicted entries are left for ``prune_stale_queue_entries`` or manual
|
|
155
164
|
``coord merge --drop``.
|
|
165
|
+
|
|
166
|
+
#2974: ``removed_confirm_worktrees`` is independent of the DB-archiving
|
|
167
|
+
``cutoff``/``retention_days`` above (it has its own, much shorter,
|
|
168
|
+
:data:`coord.confirm_test.STALE_WORKTREE_MAX_AGE_HOURS` window) and runs
|
|
169
|
+
even when DB archiving itself is disabled (``COORD_ARCHIVE_RETENTION_DAYS``
|
|
170
|
+
``<= 0``) — a disk leak on the daemon host is not something an operator
|
|
171
|
+
who merely turned off DB archiving meant to also keep.
|
|
156
172
|
"""
|
|
173
|
+
from coord.confirm_test import sweep_stale_confirm_worktrees # noqa: PLC0415
|
|
174
|
+
|
|
175
|
+
swept_worktrees = sweep_stale_confirm_worktrees(dry_run=dry_run, now=now)
|
|
176
|
+
|
|
157
177
|
cutoff = _archive_cutoff(now)
|
|
158
178
|
result = {
|
|
159
179
|
"archived_assignments": 0,
|
|
160
180
|
"archived_notifications": 0,
|
|
161
181
|
"archived_merge_queue": 0,
|
|
182
|
+
"removed_confirm_worktrees": len(swept_worktrees["removed"]),
|
|
162
183
|
"dry_run": dry_run,
|
|
163
184
|
"retention_days": _archive_retention_days(),
|
|
164
185
|
}
|
|
165
186
|
if cutoff is None:
|
|
166
|
-
return result # archiving disabled
|
|
187
|
+
return result # DB archiving disabled; the worktree sweep above still ran
|
|
167
188
|
|
|
168
189
|
conn = get_connection()
|
|
169
190
|
index = [
|
|
@@ -739,7 +739,9 @@ def _audit_housekeeping_sweep(swept: dict) -> None:
|
|
|
739
739
|
f"housekeeping: archived {swept.get('archived_assignments', 0)} "
|
|
740
740
|
f"assignment(s), {swept.get('archived_notifications', 0)} "
|
|
741
741
|
f"notification(s), {swept.get('archived_merge_queue', 0)} "
|
|
742
|
-
"merge_queue entry(ies)"
|
|
742
|
+
"merge_queue entry(ies), removed "
|
|
743
|
+
f"{swept.get('removed_confirm_worktrees', 0)} stale "
|
|
744
|
+
"confirm-worktree(s) (#2974)"
|
|
743
745
|
),
|
|
744
746
|
details=swept,
|
|
745
747
|
)
|
|
@@ -9477,13 +9479,16 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
|
|
|
9477
9479
|
swept.get("archived_assignments")
|
|
9478
9480
|
or swept.get("archived_notifications")
|
|
9479
9481
|
or swept.get("archived_merge_queue")
|
|
9482
|
+
or swept.get("removed_confirm_worktrees")
|
|
9480
9483
|
):
|
|
9481
9484
|
log.info(
|
|
9482
9485
|
"housekeeping: archived %d assignment(s), "
|
|
9483
|
-
"%d notification(s), %d merge_queue entry(ies)"
|
|
9486
|
+
"%d notification(s), %d merge_queue entry(ies), "
|
|
9487
|
+
"removed %d stale confirm-worktree(s)",
|
|
9484
9488
|
swept["archived_assignments"],
|
|
9485
9489
|
swept["archived_notifications"],
|
|
9486
9490
|
swept.get("archived_merge_queue", 0),
|
|
9491
|
+
swept.get("removed_confirm_worktrees", 0),
|
|
9487
9492
|
)
|
|
9488
9493
|
_audit_housekeeping_sweep(swept)
|
|
9489
9494
|
except Exception: # noqa: BLE001
|
|
@@ -127,6 +127,25 @@ class ReleaseAssetNotFoundError(RuntimeError):
|
|
|
127
127
|
"""The release exists but doesn't carry the asset this host needs."""
|
|
128
128
|
|
|
129
129
|
|
|
130
|
+
class EmptyReleaseChannelError(RuntimeError):
|
|
131
|
+
"""The channel has never published a release at all (#2981).
|
|
132
|
+
|
|
133
|
+
Distinct from :class:`ReleaseAssetNotFoundError` on purpose: that one
|
|
134
|
+
means a real release exists but is missing something (an asset, a usable
|
|
135
|
+
``tag_name``); this one means there is **no release to even look at** —
|
|
136
|
+
``/releases/latest`` 404s because the repo has zero releases and zero
|
|
137
|
+
tags, not because of a network problem or a malformed one.
|
|
138
|
+
|
|
139
|
+
The distinction matters to callers precisely because the two are not
|
|
140
|
+
graded the same way: "nothing has been published yet" is a fact about
|
|
141
|
+
the channel, not about whatever this run tried to do, so it must never
|
|
142
|
+
be treated as evidence that an install/roll attempt itself failed (see
|
|
143
|
+
``coord/commands/tui.py``'s ``tui update`` and
|
|
144
|
+
``coord/commands/release.py``'s ``_roll_tui``, which special-case this
|
|
145
|
+
exact exception type rather than string-matching an error message).
|
|
146
|
+
"""
|
|
147
|
+
|
|
148
|
+
|
|
130
149
|
@dataclass(frozen=True)
|
|
131
150
|
class ReleaseAsset:
|
|
132
151
|
name: str
|
|
@@ -220,9 +239,21 @@ def fetch_latest_release_tag(
|
|
|
220
239
|
invocation, or worse, an accidental match on an unrelated release that
|
|
221
240
|
happened to share a number.
|
|
222
241
|
|
|
223
|
-
Raises
|
|
224
|
-
all —
|
|
225
|
-
|
|
242
|
+
Raises :class:`EmptyReleaseChannelError` when the channel has no release
|
|
243
|
+
at all — a bare 404 from ``/releases/latest`` (GitHub's own signal for
|
|
244
|
+
"this repo has never published a release"), or a 200 whose body carries
|
|
245
|
+
no usable ``tag_name`` (belt-and-braces; not observed from the real API
|
|
246
|
+
but no less "nothing to resolve" if it ever happened). Any *other*
|
|
247
|
+
HTTP/network failure (5xx, auth, timeout, DNS) is left to raise as-is —
|
|
248
|
+
that is a real "could not check", not "nothing published yet".
|
|
249
|
+
|
|
250
|
+
#2981: this distinction is exactly what callers need to decide whether
|
|
251
|
+
an empty channel is fatal (``coord tui update`` has nothing to install)
|
|
252
|
+
or a soft "could not check" (``coord tui status``) *without* also
|
|
253
|
+
swallowing a genuine failure into the same bucket. Before this, a bare
|
|
254
|
+
404 escaped as an undifferentiated ``httpx.HTTPStatusError`` — callers
|
|
255
|
+
that wanted to tell "empty channel" apart from "the roll failed" had
|
|
256
|
+
nothing but the error message to match against.
|
|
226
257
|
"""
|
|
227
258
|
import httpx # noqa: PLC0415 — keep import cost off the non-network path
|
|
228
259
|
|
|
@@ -231,11 +262,16 @@ def fetch_latest_release_tag(
|
|
|
231
262
|
if token:
|
|
232
263
|
headers["Authorization"] = f"Bearer {token}"
|
|
233
264
|
response = httpx.get(url, timeout=timeout, headers=headers, follow_redirects=True)
|
|
265
|
+
if response.status_code == 404:
|
|
266
|
+
raise EmptyReleaseChannelError(
|
|
267
|
+
f"{repo} has no published release to resolve a latest version "
|
|
268
|
+
f"from (GET {url} -> 404 — this repo has zero releases/tags)"
|
|
269
|
+
)
|
|
234
270
|
response.raise_for_status()
|
|
235
271
|
data = response.json()
|
|
236
272
|
version = normalize_version((data or {}).get("tag_name"))
|
|
237
273
|
if not version:
|
|
238
|
-
raise
|
|
274
|
+
raise EmptyReleaseChannelError(
|
|
239
275
|
f"{repo} has no published release to resolve a latest version from"
|
|
240
276
|
)
|
|
241
277
|
return version
|
|
@@ -20,6 +20,33 @@ RECENT = NOW - 2 * 86400 # 2 days ago → inside the 14d board window
|
|
|
20
20
|
OLD = NOW - 40 * 86400 # 40 days ago → outside both windows
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
@pytest.fixture(autouse=True)
|
|
24
|
+
def _isolated_confirm_worktrees_dir(monkeypatch, tmp_path):
|
|
25
|
+
"""#2974: ``housekeeping.sweep()`` now also calls
|
|
26
|
+
``coord.confirm_test.sweep_stale_confirm_worktrees`` on every invocation
|
|
27
|
+
(even ``dry_run=False`` calls made directly, as most tests below do), and
|
|
28
|
+
that helper resolves its sweep root from the real, lazily-resolved
|
|
29
|
+
``coord.state.COORD_DIR`` (``~/.coord`` on POSIX absent a ``$COORD_DIR``
|
|
30
|
+
override). Before this fixture, every test in this file that calls the
|
|
31
|
+
real (non-dry-run) ``housekeeping.sweep()`` — or drives it through the
|
|
32
|
+
real ``/housekeeping`` endpoint — would ``shutil.rmtree`` anything under
|
|
33
|
+
the OPERATOR's real ``~/.coord/confirm-worktrees/`` older than
|
|
34
|
+
``coord.confirm_test.STALE_WORKTREE_MAX_AGE_HOURS`` as an untracked side
|
|
35
|
+
effect of running `pytest`. Pin ``coord.state.COORD_DIR`` to a private
|
|
36
|
+
``tmp_path`` for every test in this module — mirrors
|
|
37
|
+
``tests/test_confirm_test.py``'s own ``isolated_coord_dir`` fixture,
|
|
38
|
+
which the real ``sweep_stale_confirm_worktrees`` call site already
|
|
39
|
+
trusts (it re-imports ``coord.state.COORD_DIR`` fresh on every call, so
|
|
40
|
+
a plain ``monkeypatch.setattr`` here is picked up with no further
|
|
41
|
+
wiring). A file-local autouse fixture (rather than a global one in
|
|
42
|
+
``tests/conftest.py``) is deliberate: ``tests/test_platform_paths.py``
|
|
43
|
+
has real tests that assert ``coord.state.COORD_DIR`` reflects the
|
|
44
|
+
*actual* default resolution with nothing overriding it, which a global
|
|
45
|
+
override would break.
|
|
46
|
+
"""
|
|
47
|
+
monkeypatch.setattr("coord.state.COORD_DIR", tmp_path / "coord-state")
|
|
48
|
+
|
|
49
|
+
|
|
23
50
|
def _ins_assignment(
|
|
24
51
|
conn: sqlite3.Connection,
|
|
25
52
|
aid: str,
|
|
@@ -1393,6 +1393,99 @@ def test_2026_08_09_a_good_roll_is_not_reverted_by_lanes_it_cannot_roll(
|
|
|
1393
1393
|
assert "advisory" in result.output
|
|
1394
1394
|
|
|
1395
1395
|
|
|
1396
|
+
def test_2981_an_empty_tui_channel_does_not_roll_back_the_python_lanes(
|
|
1397
|
+
valid_config_path, state_dir, no_network, monkeypatch
|
|
1398
|
+
):
|
|
1399
|
+
"""THE #2981 regression, end to end.
|
|
1400
|
+
|
|
1401
|
+
`JDonaghy/coord-tui` had zero releases/tags, so `coord tui update` 404s
|
|
1402
|
+
from `/releases/latest` on every run, forever, until someone cuts a
|
|
1403
|
+
first release. `_roll_tui` on the one host that actually has an install
|
|
1404
|
+
path (`dellserver` in the real incident, `server` here) used to read
|
|
1405
|
+
that 404 exactly like a genuine install failure and report `ok=False` —
|
|
1406
|
+
a BLOCKING result. That put `(tui, server)` inside this run's attempted
|
|
1407
|
+
scope, so a merely-advisory "coord-tui is stale" verify finding on that
|
|
1408
|
+
same host turned blocking, `gate.red` went true, and
|
|
1409
|
+
`--rollback-on-red` reverted the two good python rolls right alongside
|
|
1410
|
+
the tui lane that was never actually broken — a fleet rolled forward
|
|
1411
|
+
and straight back for nothing, twice in a row, per the issue.
|
|
1412
|
+
|
|
1413
|
+
`coord tui update` now exits `EXIT_EMPTY_CHANNEL` for exactly this case
|
|
1414
|
+
(`EmptyReleaseChannelError`, raised at the source in
|
|
1415
|
+
`fetch_latest_release_tag`), and `_roll_tui` reads that exit code back
|
|
1416
|
+
into `ok=None` — the same "no channel to roll" treatment already given
|
|
1417
|
+
to a remote host with no install path at all. `ok=None` excludes the
|
|
1418
|
+
lane from `attempted_scope`, so the verify finding below stays
|
|
1419
|
+
advisory, the gate stays green, and nothing gets rolled back."""
|
|
1420
|
+
from coord import release_verify as rv
|
|
1421
|
+
|
|
1422
|
+
calls = _stub_lanes(monkeypatch)
|
|
1423
|
+
|
|
1424
|
+
def _tui(machine, **kwargs):
|
|
1425
|
+
calls.append(("tui", machine.name))
|
|
1426
|
+
if machine.name == "server":
|
|
1427
|
+
# What `_roll_tui` itself now returns when `coord tui update`
|
|
1428
|
+
# exits `EXIT_EMPTY_CHANNEL` — see its #2981 docstring section.
|
|
1429
|
+
return None, (
|
|
1430
|
+
f"{rp.CHANNEL_TUI} channel has no published release yet — "
|
|
1431
|
+
"nothing to install, not a roll failure (#2981): "
|
|
1432
|
+
"404 Not Found"
|
|
1433
|
+
)
|
|
1434
|
+
return None, "coord-tui is a per-host binary with no remote install path"
|
|
1435
|
+
|
|
1436
|
+
monkeypatch.setattr(release_cmd, "_roll_tui", _tui)
|
|
1437
|
+
_stub_verify(
|
|
1438
|
+
monkeypatch,
|
|
1439
|
+
versions={"laptop": ["0.4.110"], "server": ["0.4.110"]},
|
|
1440
|
+
findings=[
|
|
1441
|
+
# Even a CRIT finding, on the very host that attempted this
|
|
1442
|
+
# lane, must not turn the gate red once the attempt itself is
|
|
1443
|
+
# `ok=None` — that is the whole point of #2052's scoping.
|
|
1444
|
+
rv.Finding(severity="crit", host="server", lane="coord-tui",
|
|
1445
|
+
summary="coord-tui is 40h older than source"),
|
|
1446
|
+
],
|
|
1447
|
+
)
|
|
1448
|
+
monkeypatch.setattr(
|
|
1449
|
+
release_cmd, "_rollback_host",
|
|
1450
|
+
lambda *a, **k: pytest.fail(
|
|
1451
|
+
"an empty coord-tui channel is not a failed roll — it must "
|
|
1452
|
+
"never trigger --rollback-on-red"
|
|
1453
|
+
),
|
|
1454
|
+
)
|
|
1455
|
+
result = CliRunner().invoke(
|
|
1456
|
+
main,
|
|
1457
|
+
["release", "propagate", "--config", str(valid_config_path),
|
|
1458
|
+
"--target", "0.4.111", "--daemon-host", "server"],
|
|
1459
|
+
)
|
|
1460
|
+
assert result.exit_code == 0, result.output
|
|
1461
|
+
|
|
1462
|
+
record = _records(state_dir)[0]
|
|
1463
|
+
# The run completed and verified — it was never reverted.
|
|
1464
|
+
assert record["status"] == rp.STATUS_VERIFIED
|
|
1465
|
+
# The python lanes for BOTH hosts stayed rolled.
|
|
1466
|
+
for host in ("server", "laptop"):
|
|
1467
|
+
python_lane = next(
|
|
1468
|
+
l for l in record["lanes"] if l["lane"] == "python" and l["host"] == host
|
|
1469
|
+
)
|
|
1470
|
+
assert python_lane["ok"] is True, f"{host}'s good python roll must survive"
|
|
1471
|
+
|
|
1472
|
+
# The tui lane itself is recorded as unrollable, not failed.
|
|
1473
|
+
server_tui = next(
|
|
1474
|
+
l for l in record["lanes"] if l["lane"] == "tui" and l["host"] == "server"
|
|
1475
|
+
)
|
|
1476
|
+
assert server_tui["ok"] is None
|
|
1477
|
+
assert server_tui["unrollable"] is True
|
|
1478
|
+
|
|
1479
|
+
# The verify finding is still journalled in full...
|
|
1480
|
+
assert record["verification"]["severity"] == "crit"
|
|
1481
|
+
assert len(record["verification"]["findings"]) == 1
|
|
1482
|
+
# ...but the gate that `--rollback-on-red` actually acts on is clean.
|
|
1483
|
+
assert record["gate"]["severity"] == "ok"
|
|
1484
|
+
assert len(record["gate"]["blocking"]) == 0
|
|
1485
|
+
assert len(record["gate"]["advisory"]) == 1
|
|
1486
|
+
assert "advisory" in result.output
|
|
1487
|
+
|
|
1488
|
+
|
|
1396
1489
|
def test_the_outside_reach_message_names_the_manual_remedy(
|
|
1397
1490
|
valid_config_path, state_dir, no_network, monkeypatch
|
|
1398
1491
|
):
|
|
@@ -2386,3 +2479,47 @@ def test_roll_tui_surfaces_a_failed_update(monkeypatch):
|
|
|
2386
2479
|
ok, detail = release_cmd._roll_tui(_machine(name="server"), local_name="server")
|
|
2387
2480
|
assert ok is False
|
|
2388
2481
|
assert "could not resolve" in detail
|
|
2482
|
+
|
|
2483
|
+
|
|
2484
|
+
def test_roll_tui_treats_an_empty_channel_as_unrollable_not_failed(monkeypatch):
|
|
2485
|
+
"""#2981: `coord tui update` exits `EXIT_EMPTY_CHANNEL` (not the generic
|
|
2486
|
+
`1`) specifically when the channel has never published a release —
|
|
2487
|
+
`JDonaghy/coord-tui`'s actual state, which 404s from `/releases/latest`
|
|
2488
|
+
on every run forever. `_roll_tui` must read that exit code back into
|
|
2489
|
+
`ok=None`, exactly like the "no remote install path" case, so this
|
|
2490
|
+
lane never lands inside a run's attempted scope and can never be
|
|
2491
|
+
grounds for `--rollback-on-red` — see
|
|
2492
|
+
`test_2981_an_empty_tui_channel_does_not_roll_back_the_python_lanes` for
|
|
2493
|
+
the full propagate-level regression this unlocks."""
|
|
2494
|
+
from coord.commands.tui import EXIT_EMPTY_CHANNEL
|
|
2495
|
+
|
|
2496
|
+
class _Proc:
|
|
2497
|
+
returncode = EXIT_EMPTY_CHANNEL
|
|
2498
|
+
stdout = ""
|
|
2499
|
+
stderr = (
|
|
2500
|
+
"error: JDonaghy/coord-tui has no published release to resolve "
|
|
2501
|
+
"a latest version from (GET .../releases/latest -> 404 — this "
|
|
2502
|
+
"repo has zero releases/tags)"
|
|
2503
|
+
)
|
|
2504
|
+
|
|
2505
|
+
monkeypatch.setattr("subprocess.run", lambda argv, **kw: _Proc())
|
|
2506
|
+
ok, detail = release_cmd._roll_tui(_machine(name="server"), local_name="server")
|
|
2507
|
+
assert ok is None
|
|
2508
|
+
assert "not a roll failure" in detail
|
|
2509
|
+
assert "no published release" in detail
|
|
2510
|
+
|
|
2511
|
+
|
|
2512
|
+
def test_roll_tui_a_real_failure_still_blocks_after_the_2981_fix(monkeypatch):
|
|
2513
|
+
"""The other half of the #2981 acceptance bar: a GENUINE failure (a real
|
|
2514
|
+
release exists, but e.g. the asset/checksum/install step failed) must
|
|
2515
|
+
still exit the generic `1`, and `_roll_tui` must still report `ok=False`
|
|
2516
|
+
-- still blocking, still eligible to trigger a rollback."""
|
|
2517
|
+
class _Proc:
|
|
2518
|
+
returncode = 1
|
|
2519
|
+
stdout = ""
|
|
2520
|
+
stderr = "error: checksum mismatch for coord-tui-x86_64-linux"
|
|
2521
|
+
|
|
2522
|
+
monkeypatch.setattr("subprocess.run", lambda argv, **kw: _Proc())
|
|
2523
|
+
ok, detail = release_cmd._roll_tui(_machine(name="server"), local_name="server")
|
|
2524
|
+
assert ok is False
|
|
2525
|
+
assert "checksum mismatch" in detail
|