code-coordinator 0.5.309__tar.gz → 0.5.311__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.309 → code_coordinator-0.5.311}/PKG-INFO +1 -1
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/PKG-INFO +1 -1
- code_coordinator-0.5.311/code_coordinator.egg-info/scm_version.json +8 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/dispatch.py +22 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/drive_queue.py +190 -31
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/github_ops.py +102 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/wedged_drive_queue.py +37 -15
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_assign.py +62 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_drive_queue.py +43 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue.py +256 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_wedged_drive_queue.py +49 -0
- code_coordinator-0.5.309/code_coordinator.egg-info/scm_version.json +0 -8
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.gitignore +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/CLAUDE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/GOAL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/LICENSE +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/MANIFEST.in +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/README.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agent.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/block_log.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/board_service.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/brain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/claim.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/client.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/comments.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dao.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/db.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deps.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/drive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/events.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/filelock.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/freshness.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/gates.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/goal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/context.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/models.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/render.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/units.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/hooks.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/interactive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/models.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/network.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/openapi.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/parentage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/plans.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/progress.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/release_window.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/reports.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/review.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/self_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/smoke.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/split_work.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/sql.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/test_author.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/test_report.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/usage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/install-agent.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/pyproject.toml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/setup.cfg +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/backends.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/conftest.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_db.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_events.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_init.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_models.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_network.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_session.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_split.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/write_parity.py +0 -0
|
@@ -1172,6 +1172,28 @@ def assign(
|
|
|
1172
1172
|
# Fetch the issue title from GitHub
|
|
1173
1173
|
try:
|
|
1174
1174
|
issue_data = github_ops.get_issue(repo_cfg.github, issue)
|
|
1175
|
+
except github_ops.GhRateLimitError as e:
|
|
1176
|
+
if e.from_cache:
|
|
1177
|
+
# #2977: `_gh`'s pre-call guard refused this WITHOUT ever making
|
|
1178
|
+
# a network call — a shared rate-limit backoff
|
|
1179
|
+
# (`coord.github_throttle`) was already known active. That is
|
|
1180
|
+
# categorically different from a real failure: nothing about
|
|
1181
|
+
# this dispatch attempt was wrong, and the exact moment it would
|
|
1182
|
+
# succeed is already known. Exit `EX_TEMPFAIL` (not the generic
|
|
1183
|
+
# `1` below) and embed that moment in the message itself — see
|
|
1184
|
+
# `github_ops.format_throttle_skip_reason` — so
|
|
1185
|
+
# `coord/drive_queue.py`'s tick can park this launch without
|
|
1186
|
+
# spending one of its two attempts, instead of treating a
|
|
1187
|
+
# skipped call as indistinguishable from a genuine dispatch
|
|
1188
|
+
# failure (the `coord-portal#161` incident this closes).
|
|
1189
|
+
click.echo(
|
|
1190
|
+
f"error: could not fetch issue #{issue}: "
|
|
1191
|
+
f"{github_ops.format_throttle_skip_reason(e)}",
|
|
1192
|
+
err=True,
|
|
1193
|
+
)
|
|
1194
|
+
sys.exit(github_ops.EX_TEMPFAIL)
|
|
1195
|
+
click.echo(f"error: could not fetch issue #{issue}: {e}", err=True)
|
|
1196
|
+
sys.exit(1)
|
|
1175
1197
|
except RuntimeError as e:
|
|
1176
1198
|
click.echo(f"error: could not fetch issue #{issue}: {e}", err=True)
|
|
1177
1199
|
sys.exit(1)
|
|
@@ -91,6 +91,7 @@ from typing import Any, Iterable, Mapping, Sequence
|
|
|
91
91
|
|
|
92
92
|
from coord.drive_state import TERMINAL_STATUSES, WORK_LIKE
|
|
93
93
|
from coord.gate_a import is_gate_a_refusal_reason
|
|
94
|
+
from coord.github_ops import is_throttle_skip_reason, parse_throttle_skip_until
|
|
94
95
|
from coord.issues_sync_status import STALENESS_WARN_SECONDS as ISSUE_CACHE_STALE_CEILING_S
|
|
95
96
|
from coord.merge_queue import (
|
|
96
97
|
PLAN_READY,
|
|
@@ -2301,12 +2302,20 @@ class UnreachableWait:
|
|
|
2301
2302
|
evidence a genuine transient wouldn't have, and `last_reason` is
|
|
2302
2303
|
whatever the last sweep to touch this row recorded — useful context,
|
|
2303
2304
|
never re-interpreted here.
|
|
2305
|
+
|
|
2306
|
+
`dependents` (#2978) is the count of OTHER queue entries whose `after=`
|
|
2307
|
+
names this one — computed against the full entry set the caller passed
|
|
2308
|
+
to :func:`detect_unreachable_waits`, not just the flagged subset, so it
|
|
2309
|
+
is accurate even though those dependents themselves never appear in the
|
|
2310
|
+
result (see the predicate's own docstring for why). `0` for an entry
|
|
2311
|
+
nothing is chained behind.
|
|
2304
2312
|
"""
|
|
2305
2313
|
|
|
2306
2314
|
key: str
|
|
2307
2315
|
state: str
|
|
2308
2316
|
deferrals: int
|
|
2309
2317
|
last_reason: str
|
|
2318
|
+
dependents: int = 0
|
|
2310
2319
|
|
|
2311
2320
|
|
|
2312
2321
|
def detect_unreachable_waits(
|
|
@@ -2316,35 +2325,73 @@ def detect_unreachable_waits(
|
|
|
2316
2325
|
) -> list[UnreachableWait]:
|
|
2317
2326
|
"""Entries sitting in the #2944 guaranteed-false wait.
|
|
2318
2327
|
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2328
|
+
Two independent shapes, either of which qualifies a `blocked`/`parked`
|
|
2329
|
+
entry — both provably have no branch/PR/merge-queue row for any sweep to
|
|
2330
|
+
ever form an opinion about, which is the actual invariant this predicate
|
|
2331
|
+
is checking, not "attempts == 0" as a proxy for it (#2978 found the proxy
|
|
2332
|
+
wrong for the second shape):
|
|
2333
|
+
|
|
2334
|
+
* ``attempts == 0`` and ``deferrals > min_deferrals`` — never dispatched
|
|
2335
|
+
at all. The original #2944 shape.
|
|
2336
|
+
* ``attempts > 0``, ``state == blocked``, and the entry's own
|
|
2337
|
+
`last_reason` carries #2273's "no assignment was ever created for this
|
|
2338
|
+
run" marker (:func:`_is_dispatch_failure_reason`) — every dispatch
|
|
2339
|
+
attempt died before `coord assign` produced a board-visible row, and
|
|
2340
|
+
the entry has now exhausted its retry budget (the only way to reach
|
|
2341
|
+
`blocked` with that reason: see `_reconcile_running`'s `exhausted`
|
|
2342
|
+
branch). Exhaustion is its own grace period — there is no next attempt
|
|
2343
|
+
left to wait out — so `min_deferrals` is not applied here.
|
|
2344
|
+
|
|
2345
|
+
A `blocked`/`parked` entry whose `last_reason` is instead one of
|
|
2346
|
+
`_resolve_prereqs`'s unsatisfiable-`after=` verdict shapes
|
|
2347
|
+
(:func:`_is_unsatisfiable_prereq_reason`) is excluded UNCONDITIONALLY,
|
|
2348
|
+
regardless of attempts/deferrals — #2978: that shape is
|
|
2349
|
+
:func:`_reconcile_blocked_after`'s to resolve (#2362, widened #2756),
|
|
2350
|
+
not an operator's, and flagging it here directly contradicts that
|
|
2351
|
+
function's own documented behaviour. This is what keeps a chain's
|
|
2352
|
+
dependents (each blocked with "pre-req X is queued but blocked — it will
|
|
2353
|
+
never satisfy") out of the result entirely, leaving only the root that
|
|
2354
|
+
actually needs a human.
|
|
2355
|
+
|
|
2356
|
+
Pure and cheap (a predicate over already-loaded rows, no clock, no I/O),
|
|
2357
|
+
so the same function backs both `coord drive-queue status`'s `alert:`
|
|
2358
|
+
line (`coord.commands.drive_queue._queue_alert`) and the `coord doctor`
|
|
2359
|
+
WARN (`coord.health.checks.wedged_drive_queue`) — one definition of
|
|
2360
|
+
"wedged", not two that could drift apart.
|
|
2332
2361
|
"""
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2362
|
+
entries = list(entries)
|
|
2363
|
+
dependents_of: dict[str, int] = {}
|
|
2364
|
+
for e in entries:
|
|
2365
|
+
for dep in e.after:
|
|
2366
|
+
dependents_of[dep] = dependents_of.get(dep, 0) + 1
|
|
2367
|
+
|
|
2368
|
+
waits: list[UnreachableWait] = []
|
|
2369
|
+
for e in entries:
|
|
2370
|
+
if e.state not in (STATE_BLOCKED, STATE_PARKED):
|
|
2371
|
+
continue
|
|
2372
|
+
if _is_unsatisfiable_prereq_reason(e.last_reason):
|
|
2373
|
+
continue
|
|
2374
|
+
if e.attempts == 0:
|
|
2375
|
+
if e.deferrals <= min_deferrals:
|
|
2376
|
+
continue
|
|
2377
|
+
elif not (e.state == STATE_BLOCKED and _is_dispatch_failure_reason(e.last_reason)):
|
|
2378
|
+
continue
|
|
2379
|
+
waits.append(
|
|
2380
|
+
UnreachableWait(
|
|
2381
|
+
key=e.key,
|
|
2382
|
+
state=e.state,
|
|
2383
|
+
deferrals=e.deferrals,
|
|
2384
|
+
last_reason=e.last_reason,
|
|
2385
|
+
dependents=dependents_of.get(e.key, 0),
|
|
2386
|
+
)
|
|
2336
2387
|
)
|
|
2337
|
-
|
|
2338
|
-
if e.state in (STATE_BLOCKED, STATE_PARKED)
|
|
2339
|
-
and e.attempts == 0
|
|
2340
|
-
and e.deferrals > min_deferrals
|
|
2341
|
-
]
|
|
2388
|
+
return waits
|
|
2342
2389
|
|
|
2343
2390
|
|
|
2344
2391
|
def unreachable_wait_alert(waits: Sequence[UnreachableWait]) -> QueueAlert:
|
|
2345
2392
|
"""The queue-level record #2944's predicate raises, in :func:`_hold_alert`'s
|
|
2346
|
-
shape — a message naming the entry (or entries), the
|
|
2347
|
-
|
|
2393
|
+
shape — a message naming the entry (or entries), the evidence that
|
|
2394
|
+
qualified it, and the ONE remedy that actually clears it.
|
|
2348
2395
|
|
|
2349
2396
|
``add`` alone does not clear ``blocked`` (the queue list already
|
|
2350
2397
|
documents this as a footgun elsewhere) — only ``remove`` then ``add``
|
|
@@ -2356,29 +2403,52 @@ def unreachable_wait_alert(waits: Sequence[UnreachableWait]) -> QueueAlert:
|
|
|
2356
2403
|
``gate_readings``/``details`` lines are printed) so the remedy is visible
|
|
2357
2404
|
wherever this alert's ``reason`` is, not just to a caller that also reads
|
|
2358
2405
|
the structured field.
|
|
2406
|
+
|
|
2407
|
+
#2978: each name also carries its `dependents` count when non-zero — the
|
|
2408
|
+
entries chained behind a flagged root never appear in `waits` (see
|
|
2409
|
+
`detect_unreachable_waits`), so without this an operator has no way to
|
|
2410
|
+
know a fix to the one row named here will also resolve N others they
|
|
2411
|
+
never see mentioned. Explicitly says those dependents need no remedy of
|
|
2412
|
+
their own, since #2944's original wording ("for each entry named above")
|
|
2413
|
+
read, on a real incident, as an instruction to `remove`+`add` entries
|
|
2414
|
+
that were never named — but easy to mis-generalize to "the dependents
|
|
2415
|
+
too" by an operator who does not already know #2756 self-heals them.
|
|
2359
2416
|
"""
|
|
2360
|
-
|
|
2361
|
-
f"{w.key} ({w.state}, {w.deferrals} deferrals)"
|
|
2362
|
-
|
|
2417
|
+
def _name(w: UnreachableWait) -> str:
|
|
2418
|
+
base = f"{w.key} ({w.state}, {w.deferrals} deferrals)"
|
|
2419
|
+
if w.dependents:
|
|
2420
|
+
plural = "ies" if w.dependents != 1 else "y"
|
|
2421
|
+
base += (
|
|
2422
|
+
f" — {w.dependents} dependent entr{plural} chained behind it "
|
|
2423
|
+
"will self-heal automatically once this clears (#2756), no "
|
|
2424
|
+
"remedy needed on them"
|
|
2425
|
+
)
|
|
2426
|
+
return base
|
|
2427
|
+
|
|
2428
|
+
names = ", ".join(_name(w) for w in waits[:5])
|
|
2363
2429
|
more = ", ..." if len(waits) > 5 else ""
|
|
2364
2430
|
plural = len(waits) != 1
|
|
2365
2431
|
return QueueAlert(
|
|
2366
2432
|
reason=(
|
|
2367
2433
|
f"{len(waits)} queue entr{'ies' if plural else 'y'} stuck in a "
|
|
2368
|
-
"guaranteed-false wait —
|
|
2369
|
-
|
|
2434
|
+
"guaranteed-false wait — blocked/parked with no branch/PR/"
|
|
2435
|
+
"merge-queue row any sweep could ever act on (never dispatched, "
|
|
2436
|
+
"or every dispatch attempt died before creating an assignment); "
|
|
2370
2437
|
f"no sweep can ever clear this on its own: {names}{more}. Fix: "
|
|
2371
2438
|
"coord drive-queue remove <repo> <issue> && "
|
|
2372
|
-
"coord drive-queue add <repo> <issue> for each entry named
|
|
2439
|
+
"coord drive-queue add <repo> <issue> for each ROOT entry named "
|
|
2440
|
+
"above — never on a dependent chained behind one."
|
|
2373
2441
|
),
|
|
2374
2442
|
details=tuple(
|
|
2375
2443
|
f"{w.key}: {w.state}, {w.deferrals} deferrals, "
|
|
2376
|
-
f"last_reason={w.last_reason!r}"
|
|
2444
|
+
f"dependents={w.dependents}, last_reason={w.last_reason!r}"
|
|
2377
2445
|
for w in waits
|
|
2378
2446
|
),
|
|
2379
2447
|
command=(
|
|
2380
2448
|
"coord drive-queue remove <repo> <issue> && "
|
|
2381
|
-
"coord drive-queue add <repo> <issue> — for each entry
|
|
2449
|
+
"coord drive-queue add <repo> <issue> — for each ROOT entry "
|
|
2450
|
+
"named above; any dependents chained behind it self-heal on "
|
|
2451
|
+
"their own (#2756)"
|
|
2382
2452
|
),
|
|
2383
2453
|
)
|
|
2384
2454
|
|
|
@@ -3425,6 +3495,42 @@ def _reconcile_running(
|
|
|
3425
3495
|
None,
|
|
3426
3496
|
)
|
|
3427
3497
|
|
|
3498
|
+
# #2977: `coord assign` exited because `_gh`'s pre-call guard found a
|
|
3499
|
+
# shared GitHub rate-limit backoff already active and skipped the call
|
|
3500
|
+
# entirely (`GhRateLimitError(from_cache=True)`) — no `gh` call was ever
|
|
3501
|
+
# attempted for this launch. That is neither a permanent refusal (the
|
|
3502
|
+
# `is_policy_refusal_reason`/`is_gate_a_refusal_reason` shapes above —
|
|
3503
|
+
# nothing about the ISSUE was rejected) nor a genuine dispatch failure
|
|
3504
|
+
# (the generic `_dispatch_produced_nothing` note below, which would
|
|
3505
|
+
# spend an attempt): it is a fleet-wide, known-duration condition this
|
|
3506
|
+
# entry had nothing to do with. Parks WITHOUT spending an attempt
|
|
3507
|
+
# (`Reconcile.updates` carries no `attempts` key, same as every other
|
|
3508
|
+
# park above) — the wall-clock `until=` timestamp
|
|
3509
|
+
# `github_ops.format_throttle_skip_reason` embedded in `own_reason` is
|
|
3510
|
+
# what lets `plan_tick`'s parked-entry sweep resume it the moment the
|
|
3511
|
+
# backoff clears, with no live re-check and no operator action, unlike
|
|
3512
|
+
# the gate_a/policy parks just above which need one.
|
|
3513
|
+
if own_reason and is_throttle_skip_reason(own_reason):
|
|
3514
|
+
reason = (
|
|
3515
|
+
f"{own_reason} — parking without spending an attempt; the queue "
|
|
3516
|
+
"resumes it automatically once the backoff clears, no operator "
|
|
3517
|
+
"needed (#2977)"
|
|
3518
|
+
)
|
|
3519
|
+
return (
|
|
3520
|
+
Reconcile(
|
|
3521
|
+
entry.key,
|
|
3522
|
+
"parked",
|
|
3523
|
+
reason,
|
|
3524
|
+
occupies=False,
|
|
3525
|
+
updates={
|
|
3526
|
+
"state": STATE_PARKED,
|
|
3527
|
+
"last_reason": reason,
|
|
3528
|
+
"session_name": None,
|
|
3529
|
+
},
|
|
3530
|
+
),
|
|
3531
|
+
None,
|
|
3532
|
+
)
|
|
3533
|
+
|
|
3428
3534
|
permanent: tuple[str, str] | None = None
|
|
3429
3535
|
if own_reason and (exit_refused or {}).get(entry.key):
|
|
3430
3536
|
permanent = (
|
|
@@ -5008,6 +5114,59 @@ def plan_tick(
|
|
|
5008
5114
|
# clears it (`coord drive-queue remove`, same as `blocked`).
|
|
5009
5115
|
if is_policy_refusal_reason(entry.last_reason):
|
|
5010
5116
|
continue
|
|
5117
|
+
# #2977: a throttle-skip park (`github_ops.is_throttle_skip_reason`)
|
|
5118
|
+
# carries its OWN known wall-clock expiry (`until=<epoch>`, embedded
|
|
5119
|
+
# by `github_ops.format_throttle_skip_reason` at park time) — unlike
|
|
5120
|
+
# the CI-park default below, which needs a live re-check because it
|
|
5121
|
+
# has no way to know in advance when checks will report, this park
|
|
5122
|
+
# can resume on a plain clock comparison, no I/O at all. `now is
|
|
5123
|
+
# None` (a pure-logic caller with no clock) degrades to "never
|
|
5124
|
+
# resume this tick", same posture #1794's grace window uses for the
|
|
5125
|
+
# same input. An unparseable `until` (should not happen for text
|
|
5126
|
+
# this module itself wrote) or a wait that has run well past
|
|
5127
|
+
# `PARK_STALE_SECONDS` — far longer than any real backoff
|
|
5128
|
+
# (`coord.github_throttle.MAX_BACKOFF_S` is 900s) — resumes anyway
|
|
5129
|
+
# rather than parking indefinitely on a reading nothing can refresh,
|
|
5130
|
+
# the same finite-wait guarantee #2158 already gives the CI park.
|
|
5131
|
+
if is_throttle_skip_reason(entry.last_reason):
|
|
5132
|
+
if now is None:
|
|
5133
|
+
continue
|
|
5134
|
+
until = parse_throttle_skip_until(entry.last_reason)
|
|
5135
|
+
age = now - entry.reason_at if entry.reason_at is not None else None
|
|
5136
|
+
cleared = until is not None and now >= until
|
|
5137
|
+
stale = until is None or (age is not None and age > PARK_STALE_SECONDS)
|
|
5138
|
+
if not cleared and not stale:
|
|
5139
|
+
continue
|
|
5140
|
+
reason = (
|
|
5141
|
+
(
|
|
5142
|
+
f"the GitHub rate-limit backoff that parked {entry.key} "
|
|
5143
|
+
"has cleared — resuming without spending an attempt "
|
|
5144
|
+
"(#2977)"
|
|
5145
|
+
)
|
|
5146
|
+
if cleared
|
|
5147
|
+
else (
|
|
5148
|
+
f"{entry.last_reason} — this throttle-skip park has run "
|
|
5149
|
+
f"{PARK_STALE_SECONDS / 60:.0f}m+ with no refreshable "
|
|
5150
|
+
"expiry left to trust — resuming rather than parking "
|
|
5151
|
+
"indefinitely (#2977)"
|
|
5152
|
+
)
|
|
5153
|
+
)
|
|
5154
|
+
reconciles.append(
|
|
5155
|
+
Reconcile(
|
|
5156
|
+
entry.key,
|
|
5157
|
+
"resumed",
|
|
5158
|
+
reason,
|
|
5159
|
+
occupies=False,
|
|
5160
|
+
updates={
|
|
5161
|
+
"state": STATE_WAITING,
|
|
5162
|
+
"attempts": 0,
|
|
5163
|
+
"last_reason": reason,
|
|
5164
|
+
},
|
|
5165
|
+
)
|
|
5166
|
+
)
|
|
5167
|
+
states[entry.key] = STATE_WAITING
|
|
5168
|
+
effective_attempts[entry.key] = 0
|
|
5169
|
+
continue
|
|
5011
5170
|
if park_expired is not None:
|
|
5012
5171
|
# Deliberately does NOT claim CI has reported — nothing here knows
|
|
5013
5172
|
# that. It says only that the reading this park rests on has no
|
|
@@ -100,6 +100,108 @@ class GhRateLimitError(GhTransientError):
|
|
|
100
100
|
self.from_cache = from_cache
|
|
101
101
|
|
|
102
102
|
|
|
103
|
+
# ── #2977: coord-assign-side signal for a throttle-SKIPPED gh call ─────────
|
|
104
|
+
#
|
|
105
|
+
# `_gh`'s pre-call guard above raises `GhRateLimitError(from_cache=True)`
|
|
106
|
+
# WITHOUT ever making a network call, whenever a shared backoff
|
|
107
|
+
# (:mod:`coord.github_throttle`) is already known active — see that raise's
|
|
108
|
+
# own comment. Before this, that distinction was lost the moment it crossed
|
|
109
|
+
# the `coord assign` subprocess boundary: the caller (`coord/drive.py`)
|
|
110
|
+
# just saw a bare non-zero exit and folded it into the same generic "drive
|
|
111
|
+
# died" bucket as a real infrastructure failure, so `coord/drive_queue.py`'s
|
|
112
|
+
# tick spent one of the entry's two launch attempts on a call that never
|
|
113
|
+
# even reached GitHub (the 2026-08-30 `coord-portal#161` incident this
|
|
114
|
+
# closes — see the issue for the full trace).
|
|
115
|
+
#
|
|
116
|
+
# `EX_TEMPFAIL` is the conventional (sysexits.h) code for "temporary
|
|
117
|
+
# failure, retry later" — used by :mod:`coord.commands.dispatch`'s `assign`
|
|
118
|
+
# command to give this ONE failure shape a distinct exit status. That is
|
|
119
|
+
# necessary but not sufficient for `coord/drive_queue.py`'s pure tick logic
|
|
120
|
+
# to act on: the exit code alone carries no expiry, and by the time a
|
|
121
|
+
# `drive_exited` audit row is read back the file that raised the original
|
|
122
|
+
# `GhRateLimitError` is long gone, so there is nothing left to re-consult.
|
|
123
|
+
# `format_throttle_skip_reason` instead embeds everything the tick needs —
|
|
124
|
+
# the marker, and an absolute `until=<epoch>` wall-clock timestamp — directly
|
|
125
|
+
# in the human-readable reason text that already survives the subprocess
|
|
126
|
+
# boundary unmodified (`coord.drive.Driver._spawn` captures the child's
|
|
127
|
+
# stdout+stderr verbatim into `_last_run_output`, which flows straight into
|
|
128
|
+
# the `drive_exited` audit summary `coord/commands/drive_queue.py`'s
|
|
129
|
+
# `_fetch_exit_reasons` reads back as `own_reason` — no protocol change
|
|
130
|
+
# needed on that path at all). `is_throttle_skip_reason`/
|
|
131
|
+
# `parse_throttle_skip_until` are `coord/drive_queue.py`'s read side: pure
|
|
132
|
+
# text parsing, no I/O, so `_reconcile_running`'s park (and its wall-clock
|
|
133
|
+
# resume, no live re-check needed) stay exactly as pure as every other
|
|
134
|
+
# branch in that module.
|
|
135
|
+
THROTTLE_SKIP_MARKER = "[gh-throttle-skipped #2977]"
|
|
136
|
+
|
|
137
|
+
#: The conventional sysexits.h "temporary failure, please try again" code —
|
|
138
|
+
#: distinct from every other exit status `coord assign` uses (see
|
|
139
|
+
#: `coord.drive.EXIT_DISPATCH_REFUSED`/`EXIT_DEAD_END` for the other two
|
|
140
|
+
#: exit codes a downstream reader must be able to tell apart from "died").
|
|
141
|
+
EX_TEMPFAIL = 75
|
|
142
|
+
|
|
143
|
+
_THROTTLE_SKIP_UNTIL_RE = re.compile(r"until=([0-9]+(?:\.[0-9]+)?)")
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def format_throttle_skip_reason(exc: GhRateLimitError, *, now: float | None = None) -> str:
|
|
147
|
+
"""Canonical, parseable text for a ``coord assign`` refusal caused by a
|
|
148
|
+
throttle-SKIPPED ``gh`` call (``exc.from_cache`` — see
|
|
149
|
+
:class:`GhRateLimitError`'s docstring). Wraps ``str(exc)`` (already
|
|
150
|
+
carries the reason/status/request-id `_gh` recovered) with
|
|
151
|
+
:data:`THROTTLE_SKIP_MARKER` and an absolute ``until=`` epoch timestamp
|
|
152
|
+
that :func:`parse_throttle_skip_until` recovers later, with no clock of
|
|
153
|
+
its own and no access to :mod:`coord.github_throttle` needed.
|
|
154
|
+
|
|
155
|
+
``exc.retry_after_s`` is "seconds remaining AT THE MOMENT ``_gh`` raised"
|
|
156
|
+
— a value that goes stale the instant it's read back, which is exactly
|
|
157
|
+
why an absolute timestamp is embedded here (computed once, at the one
|
|
158
|
+
point in this whole path that has both a fresh clock and the exception)
|
|
159
|
+
rather than a duration re-derived downstream. Falls back to
|
|
160
|
+
:data:`coord.github_throttle.DEFAULT_BACKOFF_S` when ``retry_after_s``
|
|
161
|
+
is ``None`` (the pre-call guard's own fallback wording already reads
|
|
162
|
+
"GitHub's guidance" in that case, so this mirrors it rather than
|
|
163
|
+
inventing a shorter window with no evidence behind it).
|
|
164
|
+
"""
|
|
165
|
+
now = now if now is not None else time.time()
|
|
166
|
+
retry_after = (
|
|
167
|
+
exc.retry_after_s if exc.retry_after_s is not None else github_throttle.DEFAULT_BACKOFF_S
|
|
168
|
+
)
|
|
169
|
+
until = now + max(0.0, retry_after)
|
|
170
|
+
return (
|
|
171
|
+
f"{THROTTLE_SKIP_MARKER} {exc} — no gh call was made for this launch "
|
|
172
|
+
f"attempt, so it should not spend one (#2977); until={until:.3f}"
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def is_throttle_skip_reason(text: str | None) -> bool:
|
|
177
|
+
"""``True`` when *text* is (or contains) a :func:`format_throttle_skip_reason`
|
|
178
|
+
result — the same marker-based convention as
|
|
179
|
+
``coord.models.is_policy_refusal_reason``/``coord.gate_a.
|
|
180
|
+
is_gate_a_refusal_reason``, so ``coord/drive_queue.py`` can recognise this
|
|
181
|
+
park from plain reason text with no I/O.
|
|
182
|
+
"""
|
|
183
|
+
return bool(text) and THROTTLE_SKIP_MARKER in text
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def parse_throttle_skip_until(text: str | None) -> float | None:
|
|
187
|
+
"""The absolute epoch ``until=`` timestamp embedded by
|
|
188
|
+
:func:`format_throttle_skip_reason`, or ``None`` when *text* doesn't
|
|
189
|
+
carry the marker at all, or carries it without a parseable timestamp
|
|
190
|
+
(defensive — should not happen for text this module itself wrote, but a
|
|
191
|
+
hand-edited row or a future format change must degrade to "unknown",
|
|
192
|
+
never a wrong resume time).
|
|
193
|
+
"""
|
|
194
|
+
if not is_throttle_skip_reason(text):
|
|
195
|
+
return None
|
|
196
|
+
m = _THROTTLE_SKIP_UNTIL_RE.search(text)
|
|
197
|
+
if not m:
|
|
198
|
+
return None
|
|
199
|
+
try:
|
|
200
|
+
return float(m.group(1))
|
|
201
|
+
except ValueError:
|
|
202
|
+
return None
|
|
203
|
+
|
|
204
|
+
|
|
103
205
|
class GhTooOldForJsonChecks(GhError):
|
|
104
206
|
"""Raised when the installed ``gh`` doesn't support ``gh pr checks --json``
|
|
105
207
|
*at all* (#1564 Addendum 2), as opposed to supporting ``--json`` but
|
{code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/wedged_drive_queue.py
RENAMED
|
@@ -19,6 +19,15 @@ so this check and that line can never say different things) — this probe
|
|
|
19
19
|
just re-derives it, live, from ``drive_queue`` state every time ``coord
|
|
20
20
|
doctor`` runs, independent of whatever the last tick happened to report.
|
|
21
21
|
|
|
22
|
+
#2978: the predicate also flags an ``attempts > 0`` entry that exhausted its
|
|
23
|
+
retry budget without ever getting a #2273 dispatch-layer death past `coord
|
|
24
|
+
assign` (same "no branch/PR ever existed" invariant, just reached a
|
|
25
|
+
different way) — and excludes an entry blocked solely on an unsatisfiable
|
|
26
|
+
``after=`` pre-req, since that one is ``_reconcile_blocked_after``'s to
|
|
27
|
+
self-heal (#2362/#2756), not an operator's. See
|
|
28
|
+
``coord.drive_queue.detect_unreachable_waits`` for the exact predicate; this
|
|
29
|
+
probe does not duplicate it, only renders its result.
|
|
30
|
+
|
|
22
31
|
This is deliberately independent of #2935 (which fixes the specific sweep
|
|
23
32
|
that produced the #2900/#2907 incident) and #2230 (the sweep's origin): both
|
|
24
33
|
are about *why* a row gets wedged this way; this check is about the row
|
|
@@ -51,16 +60,19 @@ from coord.health.registry import COST_NETWORK, check
|
|
|
51
60
|
cost=COST_NETWORK,
|
|
52
61
|
description=(
|
|
53
62
|
"Drive-queue rows in `coord.drive_queue`'s #2944 guaranteed-false "
|
|
54
|
-
"wait: `blocked`/`parked
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"`release_cordon
|
|
63
|
+
"wait: `blocked`/`parked` with no branch/PR/merge-queue row any "
|
|
64
|
+
"sweep could ever act on — either `attempts == 0` (never dispatched) "
|
|
65
|
+
"past a few ticks of grace, or `attempts > 0` with an exhausted "
|
|
66
|
+
"#2273 dispatch-layer death (#2978). Excludes an entry blocked "
|
|
67
|
+
"solely on an unsatisfiable `after=` pre-req — that one is "
|
|
68
|
+
"`_reconcile_blocked_after`'s to self-heal (#2756), not an "
|
|
69
|
+
"operator's. Reads via `coord.state.list_drive_queue`, which — per "
|
|
70
|
+
"its own docstring — routes to the daemon over HTTP when "
|
|
71
|
+
"`board_service` is set (the common case on a thin-client fleet "
|
|
72
|
+
"machine, see `release_cordon.py`) and only reads the local DB "
|
|
73
|
+
"directly otherwise; `cost=network` so `--no-network`/timer runs "
|
|
74
|
+
"and the automatic per-agent health poll skip it exactly like the "
|
|
75
|
+
"other network-costed checks, same precedent as `release_cordon`."
|
|
64
76
|
),
|
|
65
77
|
)
|
|
66
78
|
def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
|
|
@@ -92,7 +104,10 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
|
|
|
92
104
|
)
|
|
93
105
|
|
|
94
106
|
sample = ", ".join(
|
|
95
|
-
f"{w.key} ({w.state}, {w.deferrals} deferrals
|
|
107
|
+
f"{w.key} ({w.state}, {w.deferrals} deferrals"
|
|
108
|
+
+ (f", {w.dependents} dependents self-heal (#2756)" if w.dependents else "")
|
|
109
|
+
+ ")"
|
|
110
|
+
for w in waits[:5]
|
|
96
111
|
)
|
|
97
112
|
return CheckResult(
|
|
98
113
|
check_id="wedged_drive_queue",
|
|
@@ -104,11 +119,17 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
|
|
|
104
119
|
),
|
|
105
120
|
detail=(
|
|
106
121
|
f"e.g. {sample}" + (", ..." if len(waits) > 5 else "")
|
|
107
|
-
+ " —
|
|
108
|
-
"
|
|
109
|
-
"
|
|
122
|
+
+ " — no branch/PR/merge-queue row any sweep could ever act on "
|
|
123
|
+
"(never dispatched, or every dispatch attempt died before "
|
|
124
|
+
"creating an assignment); cannot clear on its own. fix (root "
|
|
125
|
+
"only — any dependents self-heal, #2756): coord drive-queue "
|
|
126
|
+
"remove <repo> <issue> && coord drive-queue add <repo> <issue>"
|
|
127
|
+
),
|
|
128
|
+
threshold=(
|
|
129
|
+
"warn when any entry is blocked/parked with no branch/PR a sweep "
|
|
130
|
+
"could ever act on: attempts=0 past a few ticks of grace, or "
|
|
131
|
+
"attempts>0 with an exhausted #2273 dispatch-layer death"
|
|
110
132
|
),
|
|
111
|
-
threshold="warn when any entry is blocked/parked, attempts=0, past a few ticks of grace",
|
|
112
133
|
values={
|
|
113
134
|
"count": len(waits),
|
|
114
135
|
"entries": [
|
|
@@ -116,6 +137,7 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
|
|
|
116
137
|
"key": w.key,
|
|
117
138
|
"state": w.state,
|
|
118
139
|
"deferrals": w.deferrals,
|
|
140
|
+
"dependents": w.dependents,
|
|
119
141
|
"last_reason": w.last_reason,
|
|
120
142
|
}
|
|
121
143
|
for w in waits
|
|
@@ -495,6 +495,68 @@ class TestAssignDispatch:
|
|
|
495
495
|
assert result.exit_code == 1
|
|
496
496
|
assert "could not fetch issue" in result.output
|
|
497
497
|
|
|
498
|
+
def test_issue_fetch_throttle_skip_exits_distinctly(
|
|
499
|
+
self, config_file: Path, coord_dir: Path
|
|
500
|
+
) -> None:
|
|
501
|
+
"""#2977: a `GhRateLimitError(from_cache=True)` — `_gh`'s pre-call
|
|
502
|
+
guard skipped this `gh issue view` call WITHOUT making a network
|
|
503
|
+
call because a shared rate-limit backoff was already known active
|
|
504
|
+
— is a categorically different failure from an ordinary fetch error
|
|
505
|
+
(the generic `RuntimeError` case just above, still exit `1`). It
|
|
506
|
+
must exit `github_ops.EX_TEMPFAIL`, and the printed message must
|
|
507
|
+
carry `THROTTLE_SKIP_MARKER` plus an absolute `until=` timestamp, so
|
|
508
|
+
`coord drive-queue`'s tick (`coord/drive_queue.py`'s
|
|
509
|
+
`is_throttle_skip_reason`/`parse_throttle_skip_until`) can park this
|
|
510
|
+
launch without spending one of its two attempts instead of treating
|
|
511
|
+
it like a genuine dispatch failure (the `coord-portal#161`
|
|
512
|
+
incident)."""
|
|
513
|
+
from coord.github_ops import EX_TEMPFAIL, GhRateLimitError, THROTTLE_SKIP_MARKER
|
|
514
|
+
|
|
515
|
+
with patch(
|
|
516
|
+
"coord.github_ops.get_issue",
|
|
517
|
+
side_effect=GhRateLimitError(
|
|
518
|
+
"gh issue view 999 --repo acme/api --json ... skipped: GitHub "
|
|
519
|
+
"secondary_rate_limit backoff active for 59s more "
|
|
520
|
+
"(status=403, request_id=abc123)",
|
|
521
|
+
status_code=403, request_id="abc123", retry_after_s=59.0,
|
|
522
|
+
secondary=True, from_cache=True,
|
|
523
|
+
),
|
|
524
|
+
):
|
|
525
|
+
result = CliRunner().invoke(
|
|
526
|
+
main,
|
|
527
|
+
["assign", "laptop", "api", "999", "--config", str(config_file)],
|
|
528
|
+
)
|
|
529
|
+
assert result.exit_code == EX_TEMPFAIL
|
|
530
|
+
assert result.exit_code != 1
|
|
531
|
+
assert "could not fetch issue" in result.output
|
|
532
|
+
assert THROTTLE_SKIP_MARKER in result.output
|
|
533
|
+
assert "until=" in result.output
|
|
534
|
+
|
|
535
|
+
def test_issue_fetch_real_rate_limit_hit_keeps_the_generic_exit(
|
|
536
|
+
self, config_file: Path, coord_dir: Path
|
|
537
|
+
) -> None:
|
|
538
|
+
"""The counterpart: a `GhRateLimitError` from an ACTUAL network call
|
|
539
|
+
(`from_cache=False`) is a genuine observation, not a skip — it must
|
|
540
|
+
keep exiting the generic `1` the `RuntimeError` case above does, not
|
|
541
|
+
`EX_TEMPFAIL`, so it is never mistaken for the zero-attempt-cost
|
|
542
|
+
skip class this issue fixes."""
|
|
543
|
+
from coord.github_ops import GhRateLimitError
|
|
544
|
+
|
|
545
|
+
with patch(
|
|
546
|
+
"coord.github_ops.get_issue",
|
|
547
|
+
side_effect=GhRateLimitError(
|
|
548
|
+
"gh issue view 999 --repo acme/api --json ... failed: API "
|
|
549
|
+
"rate limit exceeded",
|
|
550
|
+
status_code=403, retry_after_s=60.0, from_cache=False,
|
|
551
|
+
),
|
|
552
|
+
):
|
|
553
|
+
result = CliRunner().invoke(
|
|
554
|
+
main,
|
|
555
|
+
["assign", "laptop", "api", "999", "--config", str(config_file)],
|
|
556
|
+
)
|
|
557
|
+
assert result.exit_code == 1
|
|
558
|
+
assert "could not fetch issue" in result.output
|
|
559
|
+
|
|
498
560
|
def test_briefing_post_failure_is_nonfatal(
|
|
499
561
|
self, config_file: Path, coord_dir: Path
|
|
500
562
|
) -> None:
|