code-coordinator 0.5.309__tar.gz → 0.5.310__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.310}/PKG-INFO +1 -1
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/dispatch.py +22 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/drive_queue.py +90 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/github_ops.py +102 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_assign.py +62 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_drive_queue.py +159 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/.gitignore +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/CLAUDE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/GOAL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/LICENSE +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/MANIFEST.in +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/README.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/agent.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/block_log.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/board_service.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/brain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/claim.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/client.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/comments.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/dao.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/db.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/deps.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/drive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/events.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/filelock.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/freshness.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/gates.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/goal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/context.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/models.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/render.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/health/units.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/hooks.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/interactive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/models.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/network.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/notify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/openapi.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/parentage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/plans.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/progress.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/release_window.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/reports.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/review.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/self_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/smoke.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/split_work.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/sql.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/test_author.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/test_report.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/usage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/install-agent.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/pyproject.toml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/setup.cfg +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/__init__.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/backends.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/conftest.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_db.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_events.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_init.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_models.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_network.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_review.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_session.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_split.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_state.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.309 → code_coordinator-0.5.310}/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,
|
|
@@ -3425,6 +3426,42 @@ def _reconcile_running(
|
|
|
3425
3426
|
None,
|
|
3426
3427
|
)
|
|
3427
3428
|
|
|
3429
|
+
# #2977: `coord assign` exited because `_gh`'s pre-call guard found a
|
|
3430
|
+
# shared GitHub rate-limit backoff already active and skipped the call
|
|
3431
|
+
# entirely (`GhRateLimitError(from_cache=True)`) — no `gh` call was ever
|
|
3432
|
+
# attempted for this launch. That is neither a permanent refusal (the
|
|
3433
|
+
# `is_policy_refusal_reason`/`is_gate_a_refusal_reason` shapes above —
|
|
3434
|
+
# nothing about the ISSUE was rejected) nor a genuine dispatch failure
|
|
3435
|
+
# (the generic `_dispatch_produced_nothing` note below, which would
|
|
3436
|
+
# spend an attempt): it is a fleet-wide, known-duration condition this
|
|
3437
|
+
# entry had nothing to do with. Parks WITHOUT spending an attempt
|
|
3438
|
+
# (`Reconcile.updates` carries no `attempts` key, same as every other
|
|
3439
|
+
# park above) — the wall-clock `until=` timestamp
|
|
3440
|
+
# `github_ops.format_throttle_skip_reason` embedded in `own_reason` is
|
|
3441
|
+
# what lets `plan_tick`'s parked-entry sweep resume it the moment the
|
|
3442
|
+
# backoff clears, with no live re-check and no operator action, unlike
|
|
3443
|
+
# the gate_a/policy parks just above which need one.
|
|
3444
|
+
if own_reason and is_throttle_skip_reason(own_reason):
|
|
3445
|
+
reason = (
|
|
3446
|
+
f"{own_reason} — parking without spending an attempt; the queue "
|
|
3447
|
+
"resumes it automatically once the backoff clears, no operator "
|
|
3448
|
+
"needed (#2977)"
|
|
3449
|
+
)
|
|
3450
|
+
return (
|
|
3451
|
+
Reconcile(
|
|
3452
|
+
entry.key,
|
|
3453
|
+
"parked",
|
|
3454
|
+
reason,
|
|
3455
|
+
occupies=False,
|
|
3456
|
+
updates={
|
|
3457
|
+
"state": STATE_PARKED,
|
|
3458
|
+
"last_reason": reason,
|
|
3459
|
+
"session_name": None,
|
|
3460
|
+
},
|
|
3461
|
+
),
|
|
3462
|
+
None,
|
|
3463
|
+
)
|
|
3464
|
+
|
|
3428
3465
|
permanent: tuple[str, str] | None = None
|
|
3429
3466
|
if own_reason and (exit_refused or {}).get(entry.key):
|
|
3430
3467
|
permanent = (
|
|
@@ -5008,6 +5045,59 @@ def plan_tick(
|
|
|
5008
5045
|
# clears it (`coord drive-queue remove`, same as `blocked`).
|
|
5009
5046
|
if is_policy_refusal_reason(entry.last_reason):
|
|
5010
5047
|
continue
|
|
5048
|
+
# #2977: a throttle-skip park (`github_ops.is_throttle_skip_reason`)
|
|
5049
|
+
# carries its OWN known wall-clock expiry (`until=<epoch>`, embedded
|
|
5050
|
+
# by `github_ops.format_throttle_skip_reason` at park time) — unlike
|
|
5051
|
+
# the CI-park default below, which needs a live re-check because it
|
|
5052
|
+
# has no way to know in advance when checks will report, this park
|
|
5053
|
+
# can resume on a plain clock comparison, no I/O at all. `now is
|
|
5054
|
+
# None` (a pure-logic caller with no clock) degrades to "never
|
|
5055
|
+
# resume this tick", same posture #1794's grace window uses for the
|
|
5056
|
+
# same input. An unparseable `until` (should not happen for text
|
|
5057
|
+
# this module itself wrote) or a wait that has run well past
|
|
5058
|
+
# `PARK_STALE_SECONDS` — far longer than any real backoff
|
|
5059
|
+
# (`coord.github_throttle.MAX_BACKOFF_S` is 900s) — resumes anyway
|
|
5060
|
+
# rather than parking indefinitely on a reading nothing can refresh,
|
|
5061
|
+
# the same finite-wait guarantee #2158 already gives the CI park.
|
|
5062
|
+
if is_throttle_skip_reason(entry.last_reason):
|
|
5063
|
+
if now is None:
|
|
5064
|
+
continue
|
|
5065
|
+
until = parse_throttle_skip_until(entry.last_reason)
|
|
5066
|
+
age = now - entry.reason_at if entry.reason_at is not None else None
|
|
5067
|
+
cleared = until is not None and now >= until
|
|
5068
|
+
stale = until is None or (age is not None and age > PARK_STALE_SECONDS)
|
|
5069
|
+
if not cleared and not stale:
|
|
5070
|
+
continue
|
|
5071
|
+
reason = (
|
|
5072
|
+
(
|
|
5073
|
+
f"the GitHub rate-limit backoff that parked {entry.key} "
|
|
5074
|
+
"has cleared — resuming without spending an attempt "
|
|
5075
|
+
"(#2977)"
|
|
5076
|
+
)
|
|
5077
|
+
if cleared
|
|
5078
|
+
else (
|
|
5079
|
+
f"{entry.last_reason} — this throttle-skip park has run "
|
|
5080
|
+
f"{PARK_STALE_SECONDS / 60:.0f}m+ with no refreshable "
|
|
5081
|
+
"expiry left to trust — resuming rather than parking "
|
|
5082
|
+
"indefinitely (#2977)"
|
|
5083
|
+
)
|
|
5084
|
+
)
|
|
5085
|
+
reconciles.append(
|
|
5086
|
+
Reconcile(
|
|
5087
|
+
entry.key,
|
|
5088
|
+
"resumed",
|
|
5089
|
+
reason,
|
|
5090
|
+
occupies=False,
|
|
5091
|
+
updates={
|
|
5092
|
+
"state": STATE_WAITING,
|
|
5093
|
+
"attempts": 0,
|
|
5094
|
+
"last_reason": reason,
|
|
5095
|
+
},
|
|
5096
|
+
)
|
|
5097
|
+
)
|
|
5098
|
+
states[entry.key] = STATE_WAITING
|
|
5099
|
+
effective_attempts[entry.key] = 0
|
|
5100
|
+
continue
|
|
5011
5101
|
if park_expired is not None:
|
|
5012
5102
|
# Deliberately does NOT claim CI has reported — nothing here knows
|
|
5013
5103
|
# 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
|
|
@@ -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:
|
|
@@ -2852,6 +2852,165 @@ def test_a_policy_refusal_still_reconciles_to_done_if_it_lands_by_hand():
|
|
|
2852
2852
|
assert reconcile.updates["state"] == STATE_DONE
|
|
2853
2853
|
|
|
2854
2854
|
|
|
2855
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
2856
|
+
# #2977: a throttle-SKIPPED `gh` call — `_gh`'s pre-call guard found a shared
|
|
2857
|
+
# GitHub rate-limit backoff (coord.github_throttle) already active and
|
|
2858
|
+
# raised `GhRateLimitError(from_cache=True)` WITHOUT ever making a network
|
|
2859
|
+
# call — must not be charged like a real dispatch failure. It parks (like
|
|
2860
|
+
# Gate-A/policy above) rather than blocking, spends no attempt, AND —
|
|
2861
|
+
# unlike Gate-A/policy, which wait on an external verdict — resumes itself
|
|
2862
|
+
# the instant the embedded wall-clock `until=` timestamp passes, no live
|
|
2863
|
+
# re-check and no operator action needed. coord-portal#161, 2026-08-30: two
|
|
2864
|
+
# such skips in a row parked the keystone of a 9-entry milestone.
|
|
2865
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
2866
|
+
|
|
2867
|
+
|
|
2868
|
+
def _throttle_skip_reason(*, now: float, retry_after_s: float = 59.0) -> str:
|
|
2869
|
+
"""A realistic `own_reason` string for a `running` entry whose launch
|
|
2870
|
+
died on a throttle-skipped `coord assign` — i.e. exactly what
|
|
2871
|
+
`coord/commands/drive_queue.py`'s `_fetch_exit_reasons` would read back
|
|
2872
|
+
from the `drive_exited` audit row once `coord.drive.Driver._spawn`
|
|
2873
|
+
folds the child's stderr (built by `coord/commands/dispatch.py`'s
|
|
2874
|
+
`assign` command from `github_ops.format_throttle_skip_reason`) into
|
|
2875
|
+
the summary — see this module's own #2977 comment for the full chain.
|
|
2876
|
+
"""
|
|
2877
|
+
from coord.github_ops import GhRateLimitError, format_throttle_skip_reason
|
|
2878
|
+
|
|
2879
|
+
exc = GhRateLimitError(
|
|
2880
|
+
"gh issue view 161 --repo JDonaghy/coord-portal --json "
|
|
2881
|
+
"number,title,body,state,milestone,labels skipped: GitHub "
|
|
2882
|
+
"secondary_rate_limit backoff active for "
|
|
2883
|
+
f"{retry_after_s:.0f}s more (status=403, "
|
|
2884
|
+
"request_id=A654:2496C0:1E674B6:66A49BB:6A94A599)",
|
|
2885
|
+
status_code=403,
|
|
2886
|
+
request_id="A654:2496C0:1E674B6:66A49BB:6A94A599",
|
|
2887
|
+
retry_after_s=retry_after_s,
|
|
2888
|
+
secondary=True,
|
|
2889
|
+
from_cache=True,
|
|
2890
|
+
)
|
|
2891
|
+
skip_reason = format_throttle_skip_reason(exc, now=now)
|
|
2892
|
+
return (
|
|
2893
|
+
f"drive exited for {REPO}#161 (exit_code=75): coord assign precision "
|
|
2894
|
+
f"{REPO} 161 --driven-by drive:{REPO}#161 exited 75\n output: "
|
|
2895
|
+
f"error: could not fetch issue #161: {skip_reason}"
|
|
2896
|
+
)
|
|
2897
|
+
|
|
2898
|
+
|
|
2899
|
+
def test_format_and_parse_throttle_skip_reason_round_trip():
|
|
2900
|
+
"""The seam `coord/drive_queue.py` actually depends on: the marker and
|
|
2901
|
+
the absolute `until=` timestamp `format_throttle_skip_reason` embeds
|
|
2902
|
+
must survive being read back by `is_throttle_skip_reason`/
|
|
2903
|
+
`parse_throttle_skip_until` with no clock and no I/O."""
|
|
2904
|
+
from coord.github_ops import (
|
|
2905
|
+
GhRateLimitError,
|
|
2906
|
+
format_throttle_skip_reason,
|
|
2907
|
+
is_throttle_skip_reason,
|
|
2908
|
+
parse_throttle_skip_until,
|
|
2909
|
+
)
|
|
2910
|
+
|
|
2911
|
+
exc = GhRateLimitError(
|
|
2912
|
+
"gh ... skipped: GitHub secondary_rate_limit backoff active for "
|
|
2913
|
+
"10s more (status=403, request_id=abc)",
|
|
2914
|
+
retry_after_s=10.0, secondary=True, from_cache=True,
|
|
2915
|
+
)
|
|
2916
|
+
reason = format_throttle_skip_reason(exc, now=NOW)
|
|
2917
|
+
assert is_throttle_skip_reason(reason)
|
|
2918
|
+
assert parse_throttle_skip_until(reason) == pytest.approx(NOW + 10.0)
|
|
2919
|
+
assert not is_throttle_skip_reason("an ordinary death, nothing to do with gh")
|
|
2920
|
+
assert parse_throttle_skip_until("an ordinary death") is None
|
|
2921
|
+
|
|
2922
|
+
|
|
2923
|
+
def test_a_throttle_skipped_gh_call_parks_without_spending_an_attempt():
|
|
2924
|
+
reason = _throttle_skip_reason(now=NOW)
|
|
2925
|
+
entries = [entry(161, position=3, state=STATE_RUNNING, attempts=0)]
|
|
2926
|
+
plan = plan_tick(
|
|
2927
|
+
entries, board(), capacity=1, now=NOW,
|
|
2928
|
+
exit_reasons={entry_key(REPO, 161): reason},
|
|
2929
|
+
)
|
|
2930
|
+
reconcile = plan.reconciles[0]
|
|
2931
|
+
assert reconcile.outcome == "parked"
|
|
2932
|
+
assert reconcile.updates["state"] == STATE_PARKED
|
|
2933
|
+
assert "attempts" not in reconcile.updates
|
|
2934
|
+
assert plan.blocked == () # NOT terminal `blocked`
|
|
2935
|
+
assert plan.launch is None
|
|
2936
|
+
|
|
2937
|
+
|
|
2938
|
+
def test_a_throttle_skipped_gh_call_deep_into_the_attempt_budget_still_spends_none():
|
|
2939
|
+
reason = _throttle_skip_reason(now=NOW)
|
|
2940
|
+
entries = [entry(161, state=STATE_RUNNING, attempts=DEFAULT_MAX_ATTEMPTS - 1)]
|
|
2941
|
+
plan = plan_tick(
|
|
2942
|
+
entries, board(), capacity=1, now=NOW,
|
|
2943
|
+
exit_reasons={entry_key(REPO, 161): reason},
|
|
2944
|
+
)
|
|
2945
|
+
assert plan.reconciles[0].outcome == "parked" # not "exhausted"
|
|
2946
|
+
assert plan.blocked == ()
|
|
2947
|
+
|
|
2948
|
+
|
|
2949
|
+
def test_a_parked_throttle_skip_stays_parked_before_the_backoff_clears():
|
|
2950
|
+
reason = _throttle_skip_reason(now=NOW, retry_after_s=120.0)
|
|
2951
|
+
entries = [
|
|
2952
|
+
entry(161, position=3, state="parked", attempts=0,
|
|
2953
|
+
last_reason=reason, reason_at=NOW)
|
|
2954
|
+
]
|
|
2955
|
+
plan = plan_tick(entries, board(), capacity=1, now=NOW + 30.0)
|
|
2956
|
+
assert plan.reconciles == () # still parked — backoff has not cleared yet
|
|
2957
|
+
assert plan.launch is None
|
|
2958
|
+
|
|
2959
|
+
|
|
2960
|
+
def test_a_parked_throttle_skip_resumes_the_instant_the_backoff_clears():
|
|
2961
|
+
"""The acceptance criterion: no operator action, no `remove`+`add` — the
|
|
2962
|
+
entry wakes itself exactly when `Backoff.until` passes."""
|
|
2963
|
+
reason = _throttle_skip_reason(now=NOW, retry_after_s=59.0)
|
|
2964
|
+
entries = [
|
|
2965
|
+
entry(161, position=3, state="parked", attempts=1,
|
|
2966
|
+
last_reason=reason, reason_at=NOW)
|
|
2967
|
+
]
|
|
2968
|
+
plan = plan_tick(entries, board(), capacity=1, now=NOW + 60.0)
|
|
2969
|
+
reconcile = plan.reconciles[0]
|
|
2970
|
+
assert reconcile.outcome == "resumed"
|
|
2971
|
+
assert reconcile.updates["state"] == STATE_WAITING
|
|
2972
|
+
assert reconcile.updates["attempts"] == 0
|
|
2973
|
+
|
|
2974
|
+
|
|
2975
|
+
def test_a_parked_throttle_skip_with_no_clock_never_resumes():
|
|
2976
|
+
"""`now=None` (a pure-logic caller) must never guess a resume — same
|
|
2977
|
+
fail-closed posture #1794's grace window uses for the same input."""
|
|
2978
|
+
reason = _throttle_skip_reason(now=NOW, retry_after_s=1.0)
|
|
2979
|
+
entries = [
|
|
2980
|
+
entry(161, position=3, state="parked", attempts=0, last_reason=reason)
|
|
2981
|
+
]
|
|
2982
|
+
plan = plan_tick(entries, board(), capacity=1)
|
|
2983
|
+
assert plan.reconciles == ()
|
|
2984
|
+
|
|
2985
|
+
|
|
2986
|
+
def test_a_parked_throttle_skip_with_unparseable_until_resumes_past_the_2158_ceiling():
|
|
2987
|
+
"""Defensive: text carrying the marker with no parseable `until=` (a
|
|
2988
|
+
hand-edited row, or a future format change) must still be FINITE — never
|
|
2989
|
+
a silent infinite park — bounded by the same `PARK_STALE_SECONDS`
|
|
2990
|
+
ceiling #2158 already gives the CI park."""
|
|
2991
|
+
from coord.github_ops import THROTTLE_SKIP_MARKER
|
|
2992
|
+
|
|
2993
|
+
reason = f"drive exited: {THROTTLE_SKIP_MARKER} gh skipped, no until recorded"
|
|
2994
|
+
entries = [
|
|
2995
|
+
entry(161, position=3, state="parked", attempts=0,
|
|
2996
|
+
last_reason=reason, reason_at=NOW - PARK_STALE_SECONDS - 60)
|
|
2997
|
+
]
|
|
2998
|
+
plan = plan_tick(entries, board(), capacity=1, now=NOW)
|
|
2999
|
+
reconcile = plan.reconciles[0]
|
|
3000
|
+
assert reconcile.outcome == "resumed"
|
|
3001
|
+
assert reconcile.updates["state"] == STATE_WAITING
|
|
3002
|
+
|
|
3003
|
+
|
|
3004
|
+
def test_a_throttle_skip_still_reconciles_to_done_if_it_lands_by_hand():
|
|
3005
|
+
reason = _throttle_skip_reason(now=NOW)
|
|
3006
|
+
entries = [entry(161, position=3, state="parked", attempts=0,
|
|
3007
|
+
last_reason=reason)]
|
|
3008
|
+
plan = plan_tick(entries, board(merged=(161,)), capacity=1)
|
|
3009
|
+
reconcile = plan.reconciles[0]
|
|
3010
|
+
assert reconcile.outcome == "done"
|
|
3011
|
+
assert reconcile.updates["state"] == STATE_DONE
|
|
3012
|
+
|
|
3013
|
+
|
|
2855
3014
|
# ═══════════════════════════════════════════════════════════════════════════
|
|
2856
3015
|
# #2850: a drive that exits 0 having MERGED must reconcile straight to
|
|
2857
3016
|
# `done`, never `retry` — before this fix, `own_reason` carried the drive's
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/requires.txt
RENAMED
|
File without changes
|
{code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
File without changes
|
{code_coordinator-0.5.309 → code_coordinator-0.5.310}/code_coordinator.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|