code-coordinator 0.5.312__tar.gz → 0.5.314__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.312 → code_coordinator-0.5.314}/PKG-INFO +1 -1
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/release.py +23 -1
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/tui.py +42 -8
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/tui_release.py +89 -16
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_release_propagate.py +137 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_tui_update.py +91 -4
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/.gitignore +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/CLAUDE.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/GOAL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/LICENSE +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/MANIFEST.in +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/README.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/__init__.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/agent.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/audit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/block_log.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/board_service.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/brain.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/claim.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/cli.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/client.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/comments.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/config.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/dao.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/db.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/deps.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/drive.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/events.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/filelock.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/freshness.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/gates.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/goal.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/context.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/models.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/render.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/health/units.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/hooks.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/interactive.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/models.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/network.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/notify.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/openapi.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/parentage.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/plans.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/progress.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/release_window.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/reports.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/review.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/self_health.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/smoke.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/split_work.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/sql.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/state.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/test_author.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/test_report.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/usage.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/install-agent.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/pyproject.toml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/setup.cfg +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/__init__.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/backends.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/conftest.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_config.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_db.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_events.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_init.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_models.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_network.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_review.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_session.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_split.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_state.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.312 → code_coordinator-0.5.314}/tests/write_parity.py +0 -0
|
@@ -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()
|
|
@@ -230,7 +240,7 @@ def _print_skew_notice(
|
|
|
230
240
|
"release publishes one) before an atomic rename into place -- so a "
|
|
231
241
|
"running coord-tui, or an interrupted download, never observes a "
|
|
232
242
|
"partial binary.\n\n"
|
|
233
|
-
"Dev-checkout guard: tui
|
|
243
|
+
"Dev-checkout guard: coord-tui's own Cargo.toml's committed [package] version "
|
|
234
244
|
f"is the {DEV_BUILD_SENTINEL_VERSION!r} placeholder that only "
|
|
235
245
|
"release-tui.yml's CI build stamps a real version over (never "
|
|
236
246
|
"committed back) -- so a plain local `cargo build` always reports "
|
|
@@ -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 "
|
|
@@ -321,11 +340,32 @@ def tui_update(
|
|
|
321
340
|
|
|
322
341
|
if dest_path.exists() and not force:
|
|
323
342
|
installed = read_installed_version(dest_path)
|
|
343
|
+
# #2984: check "already at the target version" BEFORE "looks like a
|
|
344
|
+
# dev build", not after. DEV_BUILD_SENTINEL_VERSION is coord-tui's
|
|
345
|
+
# committed placeholder, and it collides with coord-tui's real
|
|
346
|
+
# `v0.1.0` release tag -- a CI-built v0.1.0 binary reports the exact
|
|
347
|
+
# same string a bare `cargo build` always does. Version-equality
|
|
348
|
+
# can't tell those apart, but it doesn't need to here: if what's
|
|
349
|
+
# installed already matches what this run would install, installing
|
|
350
|
+
# again changes nothing, so there is nothing worth refusing over --
|
|
351
|
+
# dev build or not. This ordering is what makes the check stop
|
|
352
|
+
# depending on the release tag differing from the placeholder (see
|
|
353
|
+
# is_dev_build's docstring and the module docstring's "#2984"
|
|
354
|
+
# paragraph in tui_release.py); it does NOT resolve the one case
|
|
355
|
+
# that stays genuinely ambiguous -- a real dev build sitting at the
|
|
356
|
+
# destination while coord-tui's latest release also happens to be
|
|
357
|
+
# 0.1.0 -- which is a documented, self-limiting gap, not a bug here.
|
|
358
|
+
if normalize_version(installed) == target_version:
|
|
359
|
+
click.echo(
|
|
360
|
+
f"coord-tui is already v{target_version} at {dest_path} -- "
|
|
361
|
+
"nothing to do (--force to reinstall)."
|
|
362
|
+
)
|
|
363
|
+
return
|
|
324
364
|
if installed == DEV_BUILD_SENTINEL_VERSION:
|
|
325
365
|
click.echo(
|
|
326
366
|
f"refusing to overwrite {dest_path}: it reports version "
|
|
327
367
|
f"{DEV_BUILD_SENTINEL_VERSION!r}, the sentinel a locally "
|
|
328
|
-
"`cargo build`'d coord-tui always carries (coord-tui's "
|
|
368
|
+
"`cargo build`'d coord-tui always carries (coord-tui's own "
|
|
329
369
|
"Cargo.toml "
|
|
330
370
|
"committed version is only stamped for real in CI release "
|
|
331
371
|
"builds). This looks like a dev build someone is iterating "
|
|
@@ -335,12 +375,6 @@ def tui_update(
|
|
|
335
375
|
err=True,
|
|
336
376
|
)
|
|
337
377
|
sys.exit(3)
|
|
338
|
-
if normalize_version(installed) == target_version:
|
|
339
|
-
click.echo(
|
|
340
|
-
f"coord-tui is already v{target_version} at {dest_path} -- "
|
|
341
|
-
"nothing to do (--force to reinstall)."
|
|
342
|
-
)
|
|
343
|
-
return
|
|
344
378
|
|
|
345
379
|
click.echo(f"Detected platform target: {target}")
|
|
346
380
|
click.echo(f"Resolving coord-tui v{target_version} from {repo}...")
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
``release-tui.yml`` builds ``coord-tui`` for linux/macOS/Windows on every
|
|
5
5
|
``vX.Y.Z`` tag push and attaches ``coord-tui-<target>`` assets to a GitHub
|
|
6
|
-
Release, with ``
|
|
6
|
+
Release, with coord-tui's own ``Cargo.toml``'s version stamped from that tag. This module
|
|
7
7
|
is the client half: find the release to install, detect which of that
|
|
8
8
|
workflow's build-matrix targets this host needs, and install the binary
|
|
9
9
|
without a human ever visiting the Releases page by hand.
|
|
@@ -50,9 +50,9 @@ Two invariants drive the design:
|
|
|
50
50
|
interrupted download, can only ever observe the old binary or the new
|
|
51
51
|
one — never a partial file at the destination path.
|
|
52
52
|
|
|
53
|
-
* **Never clobber a dev build silently.**
|
|
54
|
-
``[package] version`` is the ``0.1.0`` placeholder — see
|
|
55
|
-
``
|
|
53
|
+
* **Never clobber a dev build silently.** coord-tui's own committed
|
|
54
|
+
``Cargo.toml``'s ``[package] version`` is the ``0.1.0`` placeholder — see
|
|
55
|
+
``src/main.rs``'s ``version_string()`` docstring in that repo — and only
|
|
56
56
|
``release-tui.yml``'s CI build stamps a real ``vX.Y.Z`` over it, as a
|
|
57
57
|
build-time edit that is never committed back. A binary built locally with
|
|
58
58
|
a bare ``cargo build`` therefore *always* reports exactly ``coord-tui
|
|
@@ -61,6 +61,23 @@ Two invariants drive the design:
|
|
|
61
61
|
destination is a developer's own local build, not a stale release —
|
|
62
62
|
:func:`is_dev_build` checks for it, and ``coord tui update`` refuses to
|
|
63
63
|
overwrite it without ``--force``.
|
|
64
|
+
|
|
65
|
+
#2984: version-equality is a *guess*, not a provenance check, and it has
|
|
66
|
+
exactly one collision — the sentinel is coord-tui's committed placeholder,
|
|
67
|
+
so a real CI-built binary reports it verbatim on precisely the tag that
|
|
68
|
+
reproduces the placeholder (``v0.1.0``, which is also where any new release
|
|
69
|
+
channel's tag line starts). ``coord tui update`` does not try to resolve
|
|
70
|
+
that collision by inspecting the binary harder; it sidesteps it by checking
|
|
71
|
+
"is the destination already at the version this run would install?"
|
|
72
|
+
*before* asking "does the destination look like a dev build?" — when they
|
|
73
|
+
already match there is nothing this run would change by installing again,
|
|
74
|
+
dev build or not, so refusing serves no purpose. The one case that stays
|
|
75
|
+
irreducibly ambiguous — a genuine local dev build sitting at the
|
|
76
|
+
destination while coord-tui's latest release *also* happens to be
|
|
77
|
+
``0.1.0`` — is a real gap, not a bug in this check: nothing short of a
|
|
78
|
+
provenance marker neither path can fake (out of scope here; see issue
|
|
79
|
+
#2984's "alternative" fix) can tell those two apart from the version
|
|
80
|
+
string alone.
|
|
64
81
|
"""
|
|
65
82
|
|
|
66
83
|
from __future__ import annotations
|
|
@@ -98,9 +115,13 @@ DEFAULT_API_BASE = "https://api.github.com"
|
|
|
98
115
|
DEFAULT_INSTALL_PATH = "~/.local/bin/coord-tui"
|
|
99
116
|
|
|
100
117
|
#: See the module docstring's "never clobber a dev build" invariant:
|
|
101
|
-
#: `
|
|
102
|
-
#: `cargo build` always reports verbatim because only release-tui.yml's
|
|
103
|
-
#: stamps a real version over it (and never commits that stamp back).
|
|
118
|
+
#: coord-tui's own `Cargo.toml`'s committed `[package] version` field, which a
|
|
119
|
+
#: plain `cargo build` always reports verbatim because only release-tui.yml's
|
|
120
|
+
#: CI stamps a real version over it (and never commits that stamp back).
|
|
121
|
+
#:
|
|
122
|
+
#: #2984: this value collides with coord-tui's real `v0.1.0` release tag —
|
|
123
|
+
#: see the module docstring's "#2984" paragraph for how `coord tui update`
|
|
124
|
+
#: avoids misreading that collision as a dev build.
|
|
104
125
|
DEV_BUILD_SENTINEL_VERSION = "0.1.0"
|
|
105
126
|
|
|
106
127
|
#: release-tui.yml's build matrix, keyed by (system, machine) as reported by
|
|
@@ -127,6 +148,25 @@ class ReleaseAssetNotFoundError(RuntimeError):
|
|
|
127
148
|
"""The release exists but doesn't carry the asset this host needs."""
|
|
128
149
|
|
|
129
150
|
|
|
151
|
+
class EmptyReleaseChannelError(RuntimeError):
|
|
152
|
+
"""The channel has never published a release at all (#2981).
|
|
153
|
+
|
|
154
|
+
Distinct from :class:`ReleaseAssetNotFoundError` on purpose: that one
|
|
155
|
+
means a real release exists but is missing something (an asset, a usable
|
|
156
|
+
``tag_name``); this one means there is **no release to even look at** —
|
|
157
|
+
``/releases/latest`` 404s because the repo has zero releases and zero
|
|
158
|
+
tags, not because of a network problem or a malformed one.
|
|
159
|
+
|
|
160
|
+
The distinction matters to callers precisely because the two are not
|
|
161
|
+
graded the same way: "nothing has been published yet" is a fact about
|
|
162
|
+
the channel, not about whatever this run tried to do, so it must never
|
|
163
|
+
be treated as evidence that an install/roll attempt itself failed (see
|
|
164
|
+
``coord/commands/tui.py``'s ``tui update`` and
|
|
165
|
+
``coord/commands/release.py``'s ``_roll_tui``, which special-case this
|
|
166
|
+
exact exception type rather than string-matching an error message).
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
|
|
130
170
|
@dataclass(frozen=True)
|
|
131
171
|
class ReleaseAsset:
|
|
132
172
|
name: str
|
|
@@ -220,9 +260,21 @@ def fetch_latest_release_tag(
|
|
|
220
260
|
invocation, or worse, an accidental match on an unrelated release that
|
|
221
261
|
happened to share a number.
|
|
222
262
|
|
|
223
|
-
Raises
|
|
224
|
-
all —
|
|
225
|
-
|
|
263
|
+
Raises :class:`EmptyReleaseChannelError` when the channel has no release
|
|
264
|
+
at all — a bare 404 from ``/releases/latest`` (GitHub's own signal for
|
|
265
|
+
"this repo has never published a release"), or a 200 whose body carries
|
|
266
|
+
no usable ``tag_name`` (belt-and-braces; not observed from the real API
|
|
267
|
+
but no less "nothing to resolve" if it ever happened). Any *other*
|
|
268
|
+
HTTP/network failure (5xx, auth, timeout, DNS) is left to raise as-is —
|
|
269
|
+
that is a real "could not check", not "nothing published yet".
|
|
270
|
+
|
|
271
|
+
#2981: this distinction is exactly what callers need to decide whether
|
|
272
|
+
an empty channel is fatal (``coord tui update`` has nothing to install)
|
|
273
|
+
or a soft "could not check" (``coord tui status``) *without* also
|
|
274
|
+
swallowing a genuine failure into the same bucket. Before this, a bare
|
|
275
|
+
404 escaped as an undifferentiated ``httpx.HTTPStatusError`` — callers
|
|
276
|
+
that wanted to tell "empty channel" apart from "the roll failed" had
|
|
277
|
+
nothing but the error message to match against.
|
|
226
278
|
"""
|
|
227
279
|
import httpx # noqa: PLC0415 — keep import cost off the non-network path
|
|
228
280
|
|
|
@@ -231,11 +283,16 @@ def fetch_latest_release_tag(
|
|
|
231
283
|
if token:
|
|
232
284
|
headers["Authorization"] = f"Bearer {token}"
|
|
233
285
|
response = httpx.get(url, timeout=timeout, headers=headers, follow_redirects=True)
|
|
286
|
+
if response.status_code == 404:
|
|
287
|
+
raise EmptyReleaseChannelError(
|
|
288
|
+
f"{repo} has no published release to resolve a latest version "
|
|
289
|
+
f"from (GET {url} -> 404 — this repo has zero releases/tags)"
|
|
290
|
+
)
|
|
234
291
|
response.raise_for_status()
|
|
235
292
|
data = response.json()
|
|
236
293
|
version = normalize_version((data or {}).get("tag_name"))
|
|
237
294
|
if not version:
|
|
238
|
-
raise
|
|
295
|
+
raise EmptyReleaseChannelError(
|
|
239
296
|
f"{repo} has no published release to resolve a latest version from"
|
|
240
297
|
)
|
|
241
298
|
return version
|
|
@@ -318,7 +375,8 @@ def install_atomically(tmp_path: Path, dest_path: Path) -> None:
|
|
|
318
375
|
def read_installed_version(binary_path: Path, timeout: float = 5.0) -> str | None:
|
|
319
376
|
"""Parse ``<binary_path> --version``'s ``coord-tui <version>`` output,
|
|
320
377
|
or ``None`` when the path doesn't exist, isn't runnable, or its output
|
|
321
|
-
doesn't match that shape (see ``
|
|
378
|
+
doesn't match that shape (see coord-tui's own ``src/main.rs``'s
|
|
379
|
+
``version_string``)."""
|
|
322
380
|
if not binary_path.exists():
|
|
323
381
|
return None
|
|
324
382
|
try:
|
|
@@ -342,7 +400,22 @@ def read_installed_version(binary_path: Path, timeout: float = 5.0) -> str | Non
|
|
|
342
400
|
return None
|
|
343
401
|
|
|
344
402
|
|
|
345
|
-
def is_dev_build(binary_path: Path) -> bool:
|
|
346
|
-
"""True when *binary_path* reports
|
|
347
|
-
|
|
348
|
-
|
|
403
|
+
def is_dev_build(binary_path: Path, *, target_version: str | None = None) -> bool:
|
|
404
|
+
"""True when *binary_path* reports :data:`DEV_BUILD_SENTINEL_VERSION` in
|
|
405
|
+
a way that isn't already explained by the destination holding
|
|
406
|
+
*target_version* — see the module docstring's "#2984" paragraph.
|
|
407
|
+
|
|
408
|
+
#2984: the sentinel collides with coord-tui's real ``v0.1.0`` release, so
|
|
409
|
+
version-equality alone cannot always tell a genuine local ``cargo build``
|
|
410
|
+
apart from a CI-built binary of that one release. It doesn't have to: pass
|
|
411
|
+
*target_version* — the version this run resolved as "the one to install"
|
|
412
|
+
(bare, e.g. via :func:`normalize_version`) — and a destination that
|
|
413
|
+
already reports exactly that version is never reported as a dev build,
|
|
414
|
+
sentinel or not, because there is nothing a refusal would protect there.
|
|
415
|
+
Omitting *target_version* falls back to the old, collision-prone,
|
|
416
|
+
version-only check — the most a bare *binary_path* can ever support.
|
|
417
|
+
"""
|
|
418
|
+
installed = read_installed_version(binary_path)
|
|
419
|
+
if installed != DEV_BUILD_SENTINEL_VERSION:
|
|
420
|
+
return False
|
|
421
|
+
return target_version is None or installed != target_version
|
|
@@ -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
|
|
@@ -284,12 +284,21 @@ def test_tui_update_default_version_comes_from_coord_tui_not_the_coordinator(
|
|
|
284
284
|
assert os.popen(f"{dest} --version").read().strip() == f"coord-tui {TUI_VERSION}"
|
|
285
285
|
|
|
286
286
|
|
|
287
|
-
def
|
|
287
|
+
def test_tui_update_reports_an_empty_channel_distinctly(
|
|
288
288
|
stub_server, tmp_path: Path
|
|
289
289
|
) -> None:
|
|
290
|
-
"""
|
|
291
|
-
|
|
292
|
-
|
|
290
|
+
"""#2981: a repo with zero releases/tags 404s on `/releases/latest` on
|
|
291
|
+
every run, forever, until someone cuts a first release (this is
|
|
292
|
+
JDonaghy/coord-tui's actual state at the time of writing). This is still
|
|
293
|
+
fatal for `tui update` itself -- there is nothing to install, and
|
|
294
|
+
silently falling back to some other version (the coordinator's, say) is
|
|
295
|
+
precisely the cross-channel guess the split exists to prevent -- but it
|
|
296
|
+
must exit with `EXIT_EMPTY_CHANNEL`, not the generic `1` a real failure
|
|
297
|
+
uses, so a caller like `coord release propagate` can tell "nothing
|
|
298
|
+
published yet" apart from "the roll actually failed" by exit code alone
|
|
299
|
+
(`coord/commands/release.py`'s `_roll_tui` is the caller that cares)."""
|
|
300
|
+
from coord.commands.tui import EXIT_EMPTY_CHANNEL
|
|
301
|
+
|
|
293
302
|
dest = tmp_path / "bin" / "coord-tui"
|
|
294
303
|
result = CliRunner().invoke(
|
|
295
304
|
main,
|
|
@@ -297,6 +306,24 @@ def test_tui_update_fails_loudly_when_the_channel_is_unreachable(
|
|
|
297
306
|
"--dest", str(dest), "--timeout", "5"],
|
|
298
307
|
)
|
|
299
308
|
|
|
309
|
+
assert result.exit_code == EXIT_EMPTY_CHANNEL, result.output
|
|
310
|
+
assert result.exit_code != 1
|
|
311
|
+
assert "has no published release" in result.output
|
|
312
|
+
assert not dest.exists()
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def test_tui_update_fails_loudly_on_a_genuine_network_failure(tmp_path: Path) -> None:
|
|
316
|
+
"""A real network failure -- nothing is listening on this port, so the
|
|
317
|
+
connection itself is refused -- is NOT the #2981 empty-channel case
|
|
318
|
+
above and must keep the generic exit code `1`: there is a real
|
|
319
|
+
"could not check" here, not "nothing published yet"."""
|
|
320
|
+
dest = tmp_path / "bin" / "coord-tui"
|
|
321
|
+
result = CliRunner().invoke(
|
|
322
|
+
main,
|
|
323
|
+
["tui", "update", "--repo", REPO, "--api-base", "http://127.0.0.1:1",
|
|
324
|
+
"--dest", str(dest), "--timeout", "2"],
|
|
325
|
+
)
|
|
326
|
+
|
|
300
327
|
assert result.exit_code == 1, result.output
|
|
301
328
|
assert "could not resolve coord-tui's latest release" in result.output
|
|
302
329
|
assert not dest.exists()
|
|
@@ -514,6 +541,66 @@ def test_tui_update_force_overwrites_dev_build(stub_server, tmp_path: Path) -> N
|
|
|
514
541
|
assert out == f"coord-tui {version}"
|
|
515
542
|
|
|
516
543
|
|
|
544
|
+
def test_tui_update_v0_1_0_release_is_not_misclassified_as_dev_build(
|
|
545
|
+
stub_server, tmp_path: Path
|
|
546
|
+
) -> None:
|
|
547
|
+
"""#2984 regression, pinned at the CLI level.
|
|
548
|
+
|
|
549
|
+
`DEV_BUILD_SENTINEL_VERSION` is `"0.1.0"` -- and that is ALSO coord-tui's
|
|
550
|
+
real first release tag, because `release-tui.yml` stamps the tag straight
|
|
551
|
+
over `Cargo.toml`'s committed placeholder, and the one tag that
|
|
552
|
+
reproduces the placeholder exactly is the one every new release channel
|
|
553
|
+
starts on. A host that already carries a CI-built v0.1.0 binary must be
|
|
554
|
+
able to run `coord tui update` again, with no `--force`, and have that
|
|
555
|
+
recognised as "already current" -- not refused as if it were a dev
|
|
556
|
+
build someone is iterating on.
|
|
557
|
+
"""
|
|
558
|
+
from coord.tui_release import DEV_BUILD_SENTINEL_VERSION
|
|
559
|
+
|
|
560
|
+
version = DEV_BUILD_SENTINEL_VERSION
|
|
561
|
+
assert version == "0.1.0" # fixture assumption: this IS the colliding tag
|
|
562
|
+
dest = _installed(tmp_path, version)
|
|
563
|
+
|
|
564
|
+
server = stub_server
|
|
565
|
+
lpath, lpayload = _latest_route(version)
|
|
566
|
+
server.routes[lpath] = ("json", lpayload)
|
|
567
|
+
# No asset/download routes registered: reaching the download would 404,
|
|
568
|
+
# proving the "already current" short-circuit is what actually fired.
|
|
569
|
+
|
|
570
|
+
result = CliRunner().invoke(
|
|
571
|
+
main,
|
|
572
|
+
[
|
|
573
|
+
"tui", "update",
|
|
574
|
+
"--repo", REPO,
|
|
575
|
+
"--api-base", _api_base(server),
|
|
576
|
+
"--dest", str(dest),
|
|
577
|
+
],
|
|
578
|
+
)
|
|
579
|
+
|
|
580
|
+
assert result.exit_code == 0, result.output
|
|
581
|
+
assert "nothing to do" in result.output
|
|
582
|
+
assert "refusing to overwrite" not in result.output
|
|
583
|
+
# Untouched -- the same bytes that were already there, not re-downloaded.
|
|
584
|
+
assert dest.read_bytes() == _fake_binary(version)
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
def test_is_dev_build_does_not_misclassify_the_v0_1_0_collision(tmp_path: Path) -> None:
|
|
588
|
+
"""#2984 regression, at the `tui_release.is_dev_build` unit level -- no
|
|
589
|
+
CLI or network involved. A sentinel-versioned binary whose
|
|
590
|
+
`target_version` (the release a run resolved as "the one to install") is
|
|
591
|
+
that very same value must not be reported as a dev build; that's exactly
|
|
592
|
+
the v0.1.0 collision. Omitting `target_version` keeps the old,
|
|
593
|
+
collision-prone, version-only check, asserted here as a control so this
|
|
594
|
+
test would fail loudly if that fallback ever silently changed too."""
|
|
595
|
+
from coord.tui_release import DEV_BUILD_SENTINEL_VERSION, is_dev_build
|
|
596
|
+
|
|
597
|
+
binary = _installed(tmp_path, DEV_BUILD_SENTINEL_VERSION)
|
|
598
|
+
|
|
599
|
+
assert is_dev_build(binary) is True
|
|
600
|
+
assert is_dev_build(binary, target_version=DEV_BUILD_SENTINEL_VERSION) is False
|
|
601
|
+
assert is_dev_build(binary, target_version="0.9.9") is True
|
|
602
|
+
|
|
603
|
+
|
|
517
604
|
# ── version-skew notice (`coord tui status`, and bare `coord tui`) ─────────
|
|
518
605
|
#
|
|
519
606
|
# #2898's acceptance criterion: `coord tui status` compares against coord-tui's
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_coordinator-0.5.312 → code_coordinator-0.5.314}/code_coordinator.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{code_coordinator-0.5.312 → code_coordinator-0.5.314}/code_coordinator.egg-info/entry_points.txt
RENAMED
|
File without changes
|