code-coordinator 0.5.300__tar.gz → 0.5.302__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.300 → code_coordinator-0.5.302}/PKG-INFO +1 -1
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/code_coordinator.egg-info/scm_file_list.json +2 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/drive_queue.py +33 -1
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/drive_queue.py +123 -0
- code_coordinator-0.5.302/coord/health/checks/wedged_drive_queue.py +124 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/machine_onboard.py +207 -3
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_drive_queue.py +77 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_drive_queue.py +82 -1
- code_coordinator-0.5.302/tests/test_health_wedged_drive_queue.py +108 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_machine_onboard.py +156 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/.gitignore +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/CLAUDE.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/GOAL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/LICENSE +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/MANIFEST.in +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/README.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/__init__.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/agent.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/audit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/block_log.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/board_service.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/brain.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/claim.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/cli.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/client.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/comments.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/config.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/dao.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/db.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/deps.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/drive.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/events.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/filelock.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/freshness.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/gates.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/goal.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/context.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/models.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/render.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/health/units.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/hooks.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/interactive.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/models.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/network.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/notify.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/openapi.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/parentage.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/plans.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/progress.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/release_window.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/reports.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/review.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/self_health.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/smoke.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/split_work.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/sql.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/state.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/test_author.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/test_report.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/usage.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/install-agent.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/pyproject.toml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/setup.cfg +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/__init__.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/backends.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/conftest.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_config.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_db.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_events.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_init.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_models.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_network.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_review.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_session.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_split.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_state.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tests/write_parity.py +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.300 → code_coordinator-0.5.302}/tui/tests/acceptance.rs +0 -0
|
@@ -248,6 +248,7 @@ coord/health/checks/timer_active.py
|
|
|
248
248
|
coord/health/checks/toolchain.py
|
|
249
249
|
coord/health/checks/unit_drift.py
|
|
250
250
|
coord/health/checks/unit_enablement.py
|
|
251
|
+
coord/health/checks/wedged_drive_queue.py
|
|
251
252
|
coord/health/checks/worktrees.py
|
|
252
253
|
coord/notifier/__init__.py
|
|
253
254
|
coord/notifier/baseline.py
|
|
@@ -601,6 +602,7 @@ tests/test_health_timer_active.py
|
|
|
601
602
|
tests/test_health_toolchain.py
|
|
602
603
|
tests/test_health_unit_drift.py
|
|
603
604
|
tests/test_health_unit_enablement.py
|
|
605
|
+
tests/test_health_wedged_drive_queue.py
|
|
604
606
|
tests/test_hooks.py
|
|
605
607
|
tests/test_human_attended_437.py
|
|
606
608
|
tests/test_init.py
|
{code_coordinator-0.5.300 → code_coordinator-0.5.302}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -165,6 +165,7 @@
|
|
|
165
165
|
"coord/health/checks/toolchain.py",
|
|
166
166
|
"coord/health/checks/unit_drift.py",
|
|
167
167
|
"coord/health/checks/unit_enablement.py",
|
|
168
|
+
"coord/health/checks/wedged_drive_queue.py",
|
|
168
169
|
"coord/health/checks/worktrees.py",
|
|
169
170
|
"coord/health/cli.py",
|
|
170
171
|
"coord/health/context.py",
|
|
@@ -627,6 +628,7 @@
|
|
|
627
628
|
"tests/test_health_toolchain.py",
|
|
628
629
|
"tests/test_health_unit_drift.py",
|
|
629
630
|
"tests/test_health_unit_enablement.py",
|
|
631
|
+
"tests/test_health_wedged_drive_queue.py",
|
|
630
632
|
"tests/test_hooks.py",
|
|
631
633
|
"tests/test_human_attended_437.py",
|
|
632
634
|
"tests/test_init.py",
|
|
@@ -72,6 +72,7 @@ from coord.drive_queue import (
|
|
|
72
72
|
TickPlan,
|
|
73
73
|
add_preflight_notice,
|
|
74
74
|
build_board_view,
|
|
75
|
+
detect_unreachable_waits,
|
|
75
76
|
diagnose_blocked_after,
|
|
76
77
|
effective_max_fix_rounds,
|
|
77
78
|
entries_from_rows,
|
|
@@ -87,6 +88,7 @@ from coord.drive_queue import (
|
|
|
87
88
|
pending_probe_targets,
|
|
88
89
|
plan_tick,
|
|
89
90
|
render_plan,
|
|
91
|
+
unreachable_wait_alert,
|
|
90
92
|
validate_enqueue,
|
|
91
93
|
)
|
|
92
94
|
from coord.overlap_predict import (
|
|
@@ -1523,6 +1525,30 @@ def _queue_alert() -> dict | None:
|
|
|
1523
1525
|
return get_drive_escalation(QUEUE_ALERT_REPO, QUEUE_ALERT_ISSUE)
|
|
1524
1526
|
|
|
1525
1527
|
|
|
1528
|
+
def _unreachable_wait_alert_dict(rows: list[Mapping[str, Any]]) -> dict | None:
|
|
1529
|
+
"""#2944's synthetic queue-level alert, or ``None`` when nothing qualifies.
|
|
1530
|
+
|
|
1531
|
+
Computed fresh from the CURRENT queue rows on every call — deliberately
|
|
1532
|
+
independent of :func:`_queue_alert`'s per-tick escalation record, which a
|
|
1533
|
+
busy queue overwrites (and clears — see the tick's own ``else:
|
|
1534
|
+
_clear_queue_alert()`` branch) every single tick it finds *something*
|
|
1535
|
+
else to launch. A wedged entry with `attempts=0` sits in `blocked`/
|
|
1536
|
+
`parked` for as long as it likes regardless of what else the queue is
|
|
1537
|
+
doing, so its visibility must not depend on a tick ever having nothing
|
|
1538
|
+
better to report — see :func:`coord.drive_queue.detect_unreachable_waits`
|
|
1539
|
+
for the predicate and the #2900/#2907 incident this closes.
|
|
1540
|
+
"""
|
|
1541
|
+
waits = detect_unreachable_waits(entries_from_rows(rows))
|
|
1542
|
+
if not waits:
|
|
1543
|
+
return None
|
|
1544
|
+
synthetic = unreachable_wait_alert(waits)
|
|
1545
|
+
return {
|
|
1546
|
+
"reason": synthetic.reason,
|
|
1547
|
+
"gate_readings": " | ".join(synthetic.details),
|
|
1548
|
+
"proposed_command": synthetic.command,
|
|
1549
|
+
}
|
|
1550
|
+
|
|
1551
|
+
|
|
1526
1552
|
@drive_queue_group.command("status")
|
|
1527
1553
|
@click.option("--json", "output_json", is_flag=True, default=False, help="Emit counts + alert as JSON.")
|
|
1528
1554
|
@_CONFIG_OPTION
|
|
@@ -1532,7 +1558,13 @@ def drive_queue_status(output_json: bool, config_path: Path) -> None:
|
|
|
1532
1558
|
|
|
1533
1559
|
rows = list_drive_queue()
|
|
1534
1560
|
counts = _counts(rows)
|
|
1535
|
-
alert
|
|
1561
|
+
# #2944: a tick-raised alert (a HELD gate, "nothing eligible to launch")
|
|
1562
|
+
# takes priority when one exists — it is fresher and, on a busy queue,
|
|
1563
|
+
# `_unreachable_wait_alert_dict` would silently win-and-hide it every
|
|
1564
|
+
# time a real, actionable alert IS present. Only when the tick has
|
|
1565
|
+
# nothing to say (the common, dangerous case a queue with free slots
|
|
1566
|
+
# sits in for hours) does the guaranteed-false-wait check get to speak.
|
|
1567
|
+
alert = _queue_alert() or _unreachable_wait_alert_dict(rows)
|
|
1536
1568
|
held = fired_holds(entries_from_rows(rows))
|
|
1537
1569
|
# #2587: read directly from the marker file, not from the last tick's
|
|
1538
1570
|
# `TickPlan` — `status` may run between ticks (or on a machine that never
|
|
@@ -2260,6 +2260,129 @@ def is_unsatisfiable_prereq_reason(text: str | None) -> bool:
|
|
|
2260
2260
|
return _is_unsatisfiable_prereq_reason(text)
|
|
2261
2261
|
|
|
2262
2262
|
|
|
2263
|
+
# ── #2944: the guaranteed-false wait ─────────────────────────────────────────
|
|
2264
|
+
#
|
|
2265
|
+
# An entry with `attempts == 0` has never been dispatched: no `coord drive`
|
|
2266
|
+
# ever ran for it, so it has no branch, no PR, and no merge-queue row — and
|
|
2267
|
+
# never can have one, because nothing was ever built. A `blocked` or `parked`
|
|
2268
|
+
# entry in that state is not waiting on a gate that MIGHT clear; it is
|
|
2269
|
+
# waiting on a gate that structurally cannot exist. Whatever swept this row
|
|
2270
|
+
# last (#2230's merge-gate probe, #2935's after= graph, anything future)
|
|
2271
|
+
# cannot ever answer "yes" for it — the only exit is an operator's `remove` +
|
|
2272
|
+
# `add`.
|
|
2273
|
+
#
|
|
2274
|
+
# Deliberately independent of #2935/#2230: those fix (or will fix) individual
|
|
2275
|
+
# sweeps so they stop MISTAKING this shape for a real probe target. This
|
|
2276
|
+
# predicate does not care which sweep produced the block, or whether one
|
|
2277
|
+
# exists at all — it is the backstop that makes the NEXT undiscovered
|
|
2278
|
+
# instance of "a sweep declines to guess and therefore never terminates"
|
|
2279
|
+
# visible, instead of silent for another 32 hours (claude-coordinator#2900/
|
|
2280
|
+
# #2907: 207 and 186 deferrals, 0 attempts, ~10h and 22.7h blocked
|
|
2281
|
+
# respectively, `alert: (none)` the entire time — see #2944).
|
|
2282
|
+
#
|
|
2283
|
+
# `min_deferrals` is grace, not evidence: `deferrals` on a `blocked`/`parked`
|
|
2284
|
+
# row is whatever it had accumulated before the transition (subsequent ticks
|
|
2285
|
+
# do not bump it further — neither `_reconcile_blocked` nor
|
|
2286
|
+
# `_reconcile_blocked_unreadable` touches `deferrals`), so a fresh entry that
|
|
2287
|
+
# races straight from `waiting` to `blocked` on its very first tick reads
|
|
2288
|
+
# `deferrals=0` here regardless of how long it then sits. ~5 ticks (~15
|
|
2289
|
+
# minutes at the fleet's ~3-minute cadence) is enough that a row flagged here
|
|
2290
|
+
# has genuinely been sitting, not merely landed there this instant.
|
|
2291
|
+
UNREACHABLE_WAIT_MIN_DEFERRALS = 5
|
|
2292
|
+
|
|
2293
|
+
|
|
2294
|
+
@dataclass(frozen=True)
|
|
2295
|
+
class UnreachableWait:
|
|
2296
|
+
"""One queue entry stuck in the #2944 guaranteed-false wait.
|
|
2297
|
+
|
|
2298
|
+
See :func:`detect_unreachable_waits` for the predicate. Carries just
|
|
2299
|
+
enough for a caller to build an operator-facing message without
|
|
2300
|
+
re-deriving anything: the key names the entry, `deferrals` is the
|
|
2301
|
+
evidence a genuine transient wouldn't have, and `last_reason` is
|
|
2302
|
+
whatever the last sweep to touch this row recorded — useful context,
|
|
2303
|
+
never re-interpreted here.
|
|
2304
|
+
"""
|
|
2305
|
+
|
|
2306
|
+
key: str
|
|
2307
|
+
state: str
|
|
2308
|
+
deferrals: int
|
|
2309
|
+
last_reason: str
|
|
2310
|
+
|
|
2311
|
+
|
|
2312
|
+
def detect_unreachable_waits(
|
|
2313
|
+
entries: Iterable[QueueEntry],
|
|
2314
|
+
*,
|
|
2315
|
+
min_deferrals: int = UNREACHABLE_WAIT_MIN_DEFERRALS,
|
|
2316
|
+
) -> list[UnreachableWait]:
|
|
2317
|
+
"""Entries sitting in the #2944 guaranteed-false wait.
|
|
2318
|
+
|
|
2319
|
+
``state in (blocked, parked) AND attempts == 0 AND deferrals >
|
|
2320
|
+
min_deferrals`` — see the module comment above this function for why
|
|
2321
|
+
that combination can never resolve itself. Pure and cheap (a predicate
|
|
2322
|
+
over already-loaded rows, no clock, no I/O), so the same function backs
|
|
2323
|
+
both `coord drive-queue status`'s `alert:` line
|
|
2324
|
+
(`coord.commands.drive_queue._queue_alert`) and the `coord doctor` WARN
|
|
2325
|
+
(`coord.health.checks.wedged_drive_queue`) — one definition of "wedged",
|
|
2326
|
+
not two that could drift apart.
|
|
2327
|
+
|
|
2328
|
+
An entry with ``attempts > 0`` is excluded unconditionally, however long
|
|
2329
|
+
it has sat: it WAS dispatched at least once, so it has (or had) a real
|
|
2330
|
+
branch/PR/merge-queue row for a sweep to have a genuine opinion about —
|
|
2331
|
+
that is a legitimate wait, not an unreachable one.
|
|
2332
|
+
"""
|
|
2333
|
+
return [
|
|
2334
|
+
UnreachableWait(
|
|
2335
|
+
key=e.key, state=e.state, deferrals=e.deferrals, last_reason=e.last_reason
|
|
2336
|
+
)
|
|
2337
|
+
for e in entries
|
|
2338
|
+
if e.state in (STATE_BLOCKED, STATE_PARKED)
|
|
2339
|
+
and e.attempts == 0
|
|
2340
|
+
and e.deferrals > min_deferrals
|
|
2341
|
+
]
|
|
2342
|
+
|
|
2343
|
+
|
|
2344
|
+
def unreachable_wait_alert(waits: Sequence[UnreachableWait]) -> QueueAlert:
|
|
2345
|
+
"""The queue-level record #2944's predicate raises, in :func:`_hold_alert`'s
|
|
2346
|
+
shape — a message naming the entry (or entries), the deferral count that
|
|
2347
|
+
is the evidence, and the ONE remedy that actually clears it.
|
|
2348
|
+
|
|
2349
|
+
``add`` alone does not clear ``blocked`` (the queue list already
|
|
2350
|
+
documents this as a footgun elsewhere) — only ``remove`` then ``add``
|
|
2351
|
+
does, so that is the command surfaced here rather than the generic
|
|
2352
|
+
``coord drive-queue list`` other alerts fall back on; naming the wrong
|
|
2353
|
+
remedy on a state this non-obvious defeats the point of alerting at all.
|
|
2354
|
+
Named INLINE in ``reason`` (not only in ``command``, which
|
|
2355
|
+
``drive-queue status``'s plain-text rendering never echoes — only its
|
|
2356
|
+
``gate_readings``/``details`` lines are printed) so the remedy is visible
|
|
2357
|
+
wherever this alert's ``reason`` is, not just to a caller that also reads
|
|
2358
|
+
the structured field.
|
|
2359
|
+
"""
|
|
2360
|
+
names = ", ".join(
|
|
2361
|
+
f"{w.key} ({w.state}, {w.deferrals} deferrals)" for w in waits[:5]
|
|
2362
|
+
)
|
|
2363
|
+
more = ", ..." if len(waits) > 5 else ""
|
|
2364
|
+
plural = len(waits) != 1
|
|
2365
|
+
return QueueAlert(
|
|
2366
|
+
reason=(
|
|
2367
|
+
f"{len(waits)} queue entr{'ies' if plural else 'y'} stuck in a "
|
|
2368
|
+
"guaranteed-false wait — never dispatched (attempts=0) yet "
|
|
2369
|
+
f"blocked/parked past {UNREACHABLE_WAIT_MIN_DEFERRALS} deferrals; "
|
|
2370
|
+
f"no sweep can ever clear this on its own: {names}{more}. Fix: "
|
|
2371
|
+
"coord drive-queue remove <repo> <issue> && "
|
|
2372
|
+
"coord drive-queue add <repo> <issue> for each entry named above."
|
|
2373
|
+
),
|
|
2374
|
+
details=tuple(
|
|
2375
|
+
f"{w.key}: {w.state}, {w.deferrals} deferrals, "
|
|
2376
|
+
f"last_reason={w.last_reason!r}"
|
|
2377
|
+
for w in waits
|
|
2378
|
+
),
|
|
2379
|
+
command=(
|
|
2380
|
+
"coord drive-queue remove <repo> <issue> && "
|
|
2381
|
+
"coord drive-queue add <repo> <issue> — for each entry named above"
|
|
2382
|
+
),
|
|
2383
|
+
)
|
|
2384
|
+
|
|
2385
|
+
|
|
2263
2386
|
def _reconcile_blocked_after(
|
|
2264
2387
|
entry: QueueEntry,
|
|
2265
2388
|
board: BoardView,
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"""Drive-queue entries stuck in a guaranteed-false wait (#2944).
|
|
2
|
+
|
|
3
|
+
``coord drive-queue status``'s ``alert:`` line is a per-tick record — a busy
|
|
4
|
+
queue with free capacity elsewhere clears it every tick that finds
|
|
5
|
+
*something* to launch (see ``coord.commands.drive_queue._run_tick``'s own
|
|
6
|
+
``else: _clear_queue_alert()`` branch), even while an unrelated entry sits
|
|
7
|
+
wedged for hours. That is exactly what happened to claude-coordinator#2900
|
|
8
|
+
and #2907 on 2026-08-29: both sat ``blocked``, ``attempts=0``, 207 and 186
|
|
9
|
+
deferrals, ~10h and 22.7h respectively — and ``alert: (none)`` read clean the
|
|
10
|
+
entire time, because the rest of the queue kept launching fine.
|
|
11
|
+
|
|
12
|
+
An entry with ``attempts == 0`` has never been dispatched — no branch, no
|
|
13
|
+
PR, no merge-queue row ever existed for it, and none ever can, because
|
|
14
|
+
nothing was ever built. A ``blocked``/``parked`` entry in that state is not
|
|
15
|
+
waiting on a gate that MIGHT clear; it is waiting on a gate that structurally
|
|
16
|
+
cannot exist. ``coord.drive_queue.detect_unreachable_waits`` is the one
|
|
17
|
+
predicate for that shape (also what backs the ``status`` alert line itself,
|
|
18
|
+
so this check and that line can never say different things) — this probe
|
|
19
|
+
just re-derives it, live, from ``drive_queue`` state every time ``coord
|
|
20
|
+
doctor`` runs, independent of whatever the last tick happened to report.
|
|
21
|
+
|
|
22
|
+
This is deliberately independent of #2935 (which fixes the specific sweep
|
|
23
|
+
that produced the #2900/#2907 incident) and #2230 (the sweep's origin): both
|
|
24
|
+
are about *why* a row gets wedged this way; this check is about the row
|
|
25
|
+
being wedged *at all*, whatever sweep — present or future — produced it.
|
|
26
|
+
|
|
27
|
+
WARN, not CRIT: the fix costs an operator ~10 seconds (``coord drive-queue
|
|
28
|
+
remove`` + ``add``) once they know, and this check exists to make sure they
|
|
29
|
+
know — it is not itself an outage.
|
|
30
|
+
|
|
31
|
+
``cost=COST_NETWORK``, not ``COST_CHEAP``: ``coord.state.list_drive_queue``
|
|
32
|
+
routes to the daemon over HTTP whenever ``board_service`` is set, which is
|
|
33
|
+
the common case on a thin-client fleet machine (same situation
|
|
34
|
+
``release_cordon.py`` documents for its own board-state read) — so this is a
|
|
35
|
+
real network call on most of the fleet, not a local DB read, and must be
|
|
36
|
+
skippable by ``--no-network``/timer runs and the automatic per-agent health
|
|
37
|
+
poll exactly like the other network-costed checks.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from __future__ import annotations
|
|
41
|
+
|
|
42
|
+
from coord.health.models import CheckResult, HealthContext, Severity
|
|
43
|
+
from coord.health.registry import COST_NETWORK, check
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@check(
|
|
47
|
+
id="wedged_drive_queue",
|
|
48
|
+
scope="machine",
|
|
49
|
+
title="wedged drive-queue entries",
|
|
50
|
+
order=23,
|
|
51
|
+
cost=COST_NETWORK,
|
|
52
|
+
description=(
|
|
53
|
+
"Drive-queue rows in `coord.drive_queue`'s #2944 guaranteed-false "
|
|
54
|
+
"wait: `blocked`/`parked`, `attempts == 0` (never dispatched — no "
|
|
55
|
+
"branch, no PR, no merge-queue row ever existed or ever can), "
|
|
56
|
+
"sitting past a few ticks of grace. Reads via `coord.state."
|
|
57
|
+
"list_drive_queue`, which — per its own docstring — routes to the "
|
|
58
|
+
"daemon over HTTP when `board_service` is set (the common case on a "
|
|
59
|
+
"thin-client fleet machine, see `release_cordon.py`) and only reads "
|
|
60
|
+
"the local DB directly otherwise; `cost=network` so `--no-network`/"
|
|
61
|
+
"timer runs and the automatic per-agent health poll skip it exactly "
|
|
62
|
+
"like the other network-costed checks, same precedent as "
|
|
63
|
+
"`release_cordon`."
|
|
64
|
+
),
|
|
65
|
+
)
|
|
66
|
+
def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
|
|
67
|
+
del ctx # unused: this check reads local queue state directly, not config
|
|
68
|
+
from coord.drive_queue import ( # noqa: PLC0415
|
|
69
|
+
detect_unreachable_waits,
|
|
70
|
+
entries_from_rows,
|
|
71
|
+
)
|
|
72
|
+
from coord.state import list_drive_queue # noqa: PLC0415
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
rows = list_drive_queue()
|
|
76
|
+
waits = detect_unreachable_waits(entries_from_rows(rows))
|
|
77
|
+
except Exception as exc: # noqa: BLE001 — a probe must never raise
|
|
78
|
+
return CheckResult(
|
|
79
|
+
check_id="wedged_drive_queue",
|
|
80
|
+
scope="machine",
|
|
81
|
+
severity=Severity.UNKNOWN,
|
|
82
|
+
headroom=f"could not read the drive queue: {exc}",
|
|
83
|
+
error=str(exc),
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
if not waits:
|
|
87
|
+
return CheckResult(
|
|
88
|
+
check_id="wedged_drive_queue",
|
|
89
|
+
scope="machine",
|
|
90
|
+
severity=Severity.OK,
|
|
91
|
+
headroom="0 wedged drive-queue entries",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
sample = ", ".join(
|
|
95
|
+
f"{w.key} ({w.state}, {w.deferrals} deferrals)" for w in waits[:5]
|
|
96
|
+
)
|
|
97
|
+
return CheckResult(
|
|
98
|
+
check_id="wedged_drive_queue",
|
|
99
|
+
scope="machine",
|
|
100
|
+
severity=Severity.WARN,
|
|
101
|
+
headroom=(
|
|
102
|
+
f"{len(waits)} wedged drive-queue entr"
|
|
103
|
+
f"{'y' if len(waits) == 1 else 'ies'}"
|
|
104
|
+
),
|
|
105
|
+
detail=(
|
|
106
|
+
f"e.g. {sample}" + (", ..." if len(waits) > 5 else "")
|
|
107
|
+
+ " — never dispatched (attempts=0), cannot clear on its own; "
|
|
108
|
+
"fix: coord drive-queue remove <repo> <issue> && "
|
|
109
|
+
"coord drive-queue add <repo> <issue>"
|
|
110
|
+
),
|
|
111
|
+
threshold="warn when any entry is blocked/parked, attempts=0, past a few ticks of grace",
|
|
112
|
+
values={
|
|
113
|
+
"count": len(waits),
|
|
114
|
+
"entries": [
|
|
115
|
+
{
|
|
116
|
+
"key": w.key,
|
|
117
|
+
"state": w.state,
|
|
118
|
+
"deferrals": w.deferrals,
|
|
119
|
+
"last_reason": w.last_reason,
|
|
120
|
+
}
|
|
121
|
+
for w in waits
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
)
|
|
@@ -51,6 +51,7 @@ one distinct, *named* finding per defect, with no network and no live agents.
|
|
|
51
51
|
|
|
52
52
|
from __future__ import annotations
|
|
53
53
|
|
|
54
|
+
import re
|
|
54
55
|
from collections import Counter
|
|
55
56
|
from dataclasses import dataclass, field
|
|
56
57
|
from typing import TYPE_CHECKING
|
|
@@ -183,6 +184,13 @@ class MachineFacts:
|
|
|
183
184
|
linger: bool | None = None
|
|
184
185
|
linger_error: str | None = None
|
|
185
186
|
|
|
187
|
+
# ── Layer 6: coord resolvable from a WORKER-shaped PATH (needs SSH —
|
|
188
|
+
# `/health` cannot see it either: it answers from the AGENT's own
|
|
189
|
+
# process, which still has ~/.coord-venv/bin on PATH) ────────────────
|
|
190
|
+
coord_on_worker_path: bool | None = None
|
|
191
|
+
coord_on_worker_path_error: str | None = None
|
|
192
|
+
coord_on_worker_path_version: str | None = None
|
|
193
|
+
|
|
186
194
|
def check(self, check_id: str, subject: str | None = None) -> HealthCheckFact | None:
|
|
187
195
|
for row in self.health_checks:
|
|
188
196
|
if row.check_id == check_id and (subject is None or row.subject == subject):
|
|
@@ -288,6 +296,108 @@ def probe_linger(host: str, *, timeout: float = 20.0) -> tuple[bool | None, str
|
|
|
288
296
|
return None, "`loginctl` did not report a Linger property (not systemd?)"
|
|
289
297
|
|
|
290
298
|
|
|
299
|
+
# #2937 review: this probe must answer "can a worker resolve `coord`?" using
|
|
300
|
+
# the exact same algorithm the agent itself uses to spawn a worker — not a
|
|
301
|
+
# second, hand-rolled PATH-stripping implementation that can silently
|
|
302
|
+
# disagree with it (e.g. on a trailing slash, or a PATH entry that's already
|
|
303
|
+
# an unresolved `.blue`/`.green` path rather than the `~/.coord-venv`
|
|
304
|
+
# symlink name). `coord.agent.worker_coord_reachable()` (#2936) is the
|
|
305
|
+
# canonical, already-shipped answer to that exact question — built on
|
|
306
|
+
# `_worker_subprocess_env`'s realpath-based strip
|
|
307
|
+
# (`coord.agent._pinned_venv_bin_dirs`), the same function every real worker
|
|
308
|
+
# spawn goes through. So instead of re-deriving the strip over SSH, this
|
|
309
|
+
# probe SSHes in and asks the remote host's own pinned interpreter to import
|
|
310
|
+
# and call that function directly — the machine-doctor check and the agent's
|
|
311
|
+
# own startup check are then provably the same code, not two
|
|
312
|
+
# implementations that happen to agree today. The script is sent over
|
|
313
|
+
# stdin (`python3 -`) rather than embedded as a `-c` argument so no
|
|
314
|
+
# shell-quoting layer stands between it and the interpreter.
|
|
315
|
+
_COORD_ON_WORKER_PATH_PROBE_SCRIPT = """\
|
|
316
|
+
import subprocess
|
|
317
|
+
from coord.agent import worker_coord_reachable, _worker_subprocess_env
|
|
318
|
+
|
|
319
|
+
ok, _msg = worker_coord_reachable()
|
|
320
|
+
version = ""
|
|
321
|
+
if ok:
|
|
322
|
+
env = _worker_subprocess_env()
|
|
323
|
+
try:
|
|
324
|
+
result = subprocess.run(
|
|
325
|
+
["coord", "--version"], env=env, capture_output=True, text=True, timeout=10
|
|
326
|
+
)
|
|
327
|
+
version = (result.stdout or result.stderr or "").strip()
|
|
328
|
+
except Exception:
|
|
329
|
+
version = ""
|
|
330
|
+
print("COORD_ON_WORKER_PATH_OK=" + ("1" if ok else "0"))
|
|
331
|
+
print("VERSION=" + version.replace("\\n", " "))
|
|
332
|
+
"""
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
def probe_coord_on_worker_path(
|
|
336
|
+
host: str, *, timeout: float = 20.0
|
|
337
|
+
) -> tuple[bool | None, str | None, str | None]:
|
|
338
|
+
"""Can a WORKER-shaped shell on *host* resolve ``coord`` at all?
|
|
339
|
+
|
|
340
|
+
This is #2937's whole gap: workers are spawned with ``~/.coord-venv/bin``
|
|
341
|
+
stripped from ``PATH`` (#402, hardened by #2569) so a `pip install` in a
|
|
342
|
+
worktree can never land in the agent's own runtime venv — but nothing
|
|
343
|
+
upstream of that check ever asks whether ``coord`` is *still resolvable*
|
|
344
|
+
once that directory is gone. dell64 passed every existing layer of
|
|
345
|
+
``coord machine doctor`` — including ``runtime.agent_venv`` (which only
|
|
346
|
+
proves the AGENT can find its own venv) — while being structurally
|
|
347
|
+
incapable of recording a single test verdict, because the agent's PATH
|
|
348
|
+
was the only PATH anything had checked.
|
|
349
|
+
|
|
350
|
+
Delegates the actual found/absent decision to
|
|
351
|
+
:func:`coord.agent.worker_coord_reachable` (#2936), invoked on *host* via
|
|
352
|
+
its own pinned interpreter (``~/.coord-venv/bin/python3``) — see
|
|
353
|
+
:data:`_COORD_ON_WORKER_PATH_PROBE_SCRIPT`. This is deliberately NOT a
|
|
354
|
+
reimplementation of the PATH strip: it is the same function every real
|
|
355
|
+
worker spawn's environment is built from, run where it matters (the
|
|
356
|
+
worker host), so this check and the agent's own startup warning
|
|
357
|
+
(``worker_coord_reachable`` logged at ``AgentServer`` init) can never
|
|
358
|
+
silently disagree.
|
|
359
|
+
|
|
360
|
+
Returns ``(found, error, version)``. Fail-soft, same discipline as
|
|
361
|
+
:func:`probe_linger`: this needs SSH, which ``/health`` structurally
|
|
362
|
+
cannot substitute for (the agent process answering a probe still has its
|
|
363
|
+
own venv on PATH — proving nothing about a worker's shell) — so an SSH
|
|
364
|
+
failure, or the pinned interpreter itself being unreachable/absent,
|
|
365
|
+
reports ``(None, reason, None)``, UNKNOWN, never a fabricated CRIT.
|
|
366
|
+
``found=False`` — the actual defect this check exists to catch — is the
|
|
367
|
+
one outcome that must never collapse into UNKNOWN.
|
|
368
|
+
"""
|
|
369
|
+
import subprocess # noqa: PLC0415
|
|
370
|
+
|
|
371
|
+
try:
|
|
372
|
+
result = subprocess.run(
|
|
373
|
+
[
|
|
374
|
+
"ssh", "-o", "BatchMode=yes",
|
|
375
|
+
"-o", f"ConnectTimeout={max(1, int(timeout))}",
|
|
376
|
+
host, "$HOME/.coord-venv/bin/python3 -",
|
|
377
|
+
],
|
|
378
|
+
input=_COORD_ON_WORKER_PATH_PROBE_SCRIPT,
|
|
379
|
+
capture_output=True,
|
|
380
|
+
text=True,
|
|
381
|
+
timeout=timeout,
|
|
382
|
+
)
|
|
383
|
+
except (OSError, subprocess.SubprocessError) as exc:
|
|
384
|
+
return None, f"ssh probe failed: {exc}", None
|
|
385
|
+
if result.returncode != 0:
|
|
386
|
+
detail = (result.stderr or result.stdout or "").strip().splitlines()[-1:]
|
|
387
|
+
return None, f"ssh probe failed: {detail[0] if detail else 'no output'}", None
|
|
388
|
+
|
|
389
|
+
text = (result.stdout or "").strip()
|
|
390
|
+
if "COORD_ON_WORKER_PATH_OK=1" in text:
|
|
391
|
+
version = None
|
|
392
|
+
for line in text.splitlines():
|
|
393
|
+
if line.startswith("VERSION="):
|
|
394
|
+
version = line[len("VERSION="):].strip() or None
|
|
395
|
+
return True, None, version
|
|
396
|
+
if "COORD_ON_WORKER_PATH_OK=0" in text:
|
|
397
|
+
return False, None, None
|
|
398
|
+
return None, "worker-PATH probe produced no parseable output", None
|
|
399
|
+
|
|
400
|
+
|
|
291
401
|
def gather_facts(
|
|
292
402
|
cfg: "Config",
|
|
293
403
|
machine_name: str,
|
|
@@ -382,6 +492,11 @@ def gather_facts(
|
|
|
382
492
|
facts.linger, facts.linger_error = probe_linger(
|
|
383
493
|
machine.host, timeout=ssh_timeout
|
|
384
494
|
)
|
|
495
|
+
(
|
|
496
|
+
facts.coord_on_worker_path,
|
|
497
|
+
facts.coord_on_worker_path_error,
|
|
498
|
+
facts.coord_on_worker_path_version,
|
|
499
|
+
) = probe_coord_on_worker_path(machine.host, timeout=ssh_timeout)
|
|
385
500
|
return facts
|
|
386
501
|
|
|
387
502
|
|
|
@@ -938,6 +1053,24 @@ def evaluate_graph(facts: MachineFacts) -> list[Finding]:
|
|
|
938
1053
|
# ── Layer 6: runtime ─────────────────────────────────────────────────────────
|
|
939
1054
|
|
|
940
1055
|
|
|
1056
|
+
_VERSION_NUMBER_RE = re.compile(r"\d+(?:\.\d+)+")
|
|
1057
|
+
|
|
1058
|
+
|
|
1059
|
+
def _extract_version_number(text: str | None) -> str | None:
|
|
1060
|
+
"""Pull the dotted version number out of free-form text, e.g.
|
|
1061
|
+
``"coord, version 0.5.290"`` -> ``"0.5.290"``.
|
|
1062
|
+
|
|
1063
|
+
Used so version comparisons here are an EXACT match on the number, never
|
|
1064
|
+
a substring test (``"0.5.29" in "coord, version 0.5.290"`` is ``True``
|
|
1065
|
+
even though those are different releases — #2937 review). Returns
|
|
1066
|
+
``None`` when no dotted number is found.
|
|
1067
|
+
"""
|
|
1068
|
+
if not text:
|
|
1069
|
+
return None
|
|
1070
|
+
match = _VERSION_NUMBER_RE.search(text)
|
|
1071
|
+
return match.group(0) if match else None
|
|
1072
|
+
|
|
1073
|
+
|
|
941
1074
|
def evaluate_runtime(facts: MachineFacts) -> list[Finding]:
|
|
942
1075
|
"""The agent's own installation: its venv, and whether it survives logout.
|
|
943
1076
|
|
|
@@ -947,9 +1080,12 @@ def evaluate_runtime(facts: MachineFacts) -> list[Finding]:
|
|
|
947
1080
|
because an editable one pins the live fleet's runtime to whatever branch a
|
|
948
1081
|
worktree happens to have checked out.
|
|
949
1082
|
|
|
950
|
-
``linger``
|
|
951
|
-
|
|
952
|
-
|
|
1083
|
+
``linger`` and ``coord_on_worker_path`` are the two things ``/health``
|
|
1084
|
+
structurally cannot see: the agent answering a probe is proof only that
|
|
1085
|
+
the AGENT's own user manager / PATH is fine *right now*, not that a
|
|
1086
|
+
WORKER spawned on this host (with ``~/.coord-venv/bin`` stripped from
|
|
1087
|
+
PATH, #402/#2569) can survive logout or resolve ``coord`` at all. Both
|
|
1088
|
+
are UNKNOWN unless the caller opted into the SSH probe.
|
|
953
1089
|
"""
|
|
954
1090
|
out: list[Finding] = []
|
|
955
1091
|
|
|
@@ -990,6 +1126,74 @@ def evaluate_runtime(facts: MachineFacts) -> list[Finding]:
|
|
|
990
1126
|
)
|
|
991
1127
|
)
|
|
992
1128
|
|
|
1129
|
+
if facts.coord_on_worker_path is False:
|
|
1130
|
+
out.append(
|
|
1131
|
+
Finding(
|
|
1132
|
+
layer="runtime", check="runtime.coord_on_worker_path_missing", severity=CRIT,
|
|
1133
|
+
summary=(
|
|
1134
|
+
"`coord` does not resolve on a WORKER-shaped PATH (with "
|
|
1135
|
+
"~/.coord-venv/bin stripped, as #402/#2569 spawn workers) — "
|
|
1136
|
+
"this machine can dispatch and run a worker, but that worker "
|
|
1137
|
+
"cannot run `coord test` to record a verdict. This is exactly "
|
|
1138
|
+
"the #2937 gap: every other layer here, and `/health` itself, "
|
|
1139
|
+
"only ever sees the AGENT's own PATH"
|
|
1140
|
+
),
|
|
1141
|
+
subject=facts.name,
|
|
1142
|
+
fix=(
|
|
1143
|
+
"install `coord` somewhere on the agent user's PATH outside "
|
|
1144
|
+
"~/.coord-venv (e.g. `pipx install code-coordinator`, or a "
|
|
1145
|
+
"system-wide non-editable install) — the fix must survive "
|
|
1146
|
+
"~/.coord-venv/bin being removed from PATH, because that is "
|
|
1147
|
+
"exactly what a worker's shell does."
|
|
1148
|
+
),
|
|
1149
|
+
)
|
|
1150
|
+
)
|
|
1151
|
+
elif facts.coord_on_worker_path is True:
|
|
1152
|
+
expected_raw = (facts.version or "").strip()
|
|
1153
|
+
reported_raw = facts.coord_on_worker_path_version or ""
|
|
1154
|
+
expected = _extract_version_number(expected_raw)
|
|
1155
|
+
reported = _extract_version_number(reported_raw)
|
|
1156
|
+
# #2937 review: an EXACT comparison of the extracted version numbers,
|
|
1157
|
+
# not `expected in reported` — a substring test reads a genuine skew
|
|
1158
|
+
# as a match whenever the shorter string happens to be a substring of
|
|
1159
|
+
# the longer one (this project's own scheme: "0.5.29" in "coord,
|
|
1160
|
+
# version 0.5.290" is True even though those are different releases).
|
|
1161
|
+
if expected and expected != (reported or ""):
|
|
1162
|
+
out.append(
|
|
1163
|
+
Finding(
|
|
1164
|
+
layer="runtime", check="runtime.coord_on_worker_path_version_mismatch",
|
|
1165
|
+
severity=WARN,
|
|
1166
|
+
summary=(
|
|
1167
|
+
f"`coord` on the worker PATH reports {reported_raw!r}, but the "
|
|
1168
|
+
f"agent's own /health reports version {expected_raw!r} — a "
|
|
1169
|
+
"worker may record verdicts against a stale or unrelated "
|
|
1170
|
+
"install"
|
|
1171
|
+
),
|
|
1172
|
+
subject=facts.name,
|
|
1173
|
+
fix="reinstall/upgrade the worker-PATH `coord` to match the agent's version.",
|
|
1174
|
+
)
|
|
1175
|
+
)
|
|
1176
|
+
else:
|
|
1177
|
+
out.append(
|
|
1178
|
+
Finding(
|
|
1179
|
+
layer="runtime", check="runtime.coord_on_worker_path", severity=OK,
|
|
1180
|
+
summary=f"`coord` resolves on a worker-shaped PATH ({reported_raw or 'version unreported'})",
|
|
1181
|
+
subject=facts.name,
|
|
1182
|
+
)
|
|
1183
|
+
)
|
|
1184
|
+
else:
|
|
1185
|
+
out.append(
|
|
1186
|
+
Finding(
|
|
1187
|
+
layer="runtime", check="runtime.coord_on_worker_path_unknown", severity=UNKNOWN,
|
|
1188
|
+
summary=(
|
|
1189
|
+
"worker-PATH `coord` resolution not checked — /health cannot "
|
|
1190
|
+
f"see it (it only proves the AGENT can find coord); "
|
|
1191
|
+
f"{facts.coord_on_worker_path_error or 'pass --ssh to probe it'}"
|
|
1192
|
+
),
|
|
1193
|
+
subject=facts.name,
|
|
1194
|
+
)
|
|
1195
|
+
)
|
|
1196
|
+
|
|
993
1197
|
if facts.linger is True:
|
|
994
1198
|
out.append(
|
|
995
1199
|
Finding(
|