code-coordinator 0.5.310__tar.gz → 0.5.312__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.310 → code_coordinator-0.5.312}/PKG-INFO +1 -1
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/PKG-INFO +1 -1
- code_coordinator-0.5.312/code_coordinator.egg-info/scm_version.json +8 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/lifecycle.py +13 -1
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/confirm_test.py +131 -3
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/drive_queue.py +100 -31
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/wedged_drive_queue.py +37 -15
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/housekeeping.py +26 -5
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/serve_app.py +7 -2
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_cap_762.py +27 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_drive_queue.py +43 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_confirm_test.py +153 -6
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue.py +97 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_wedged_drive_queue.py +49 -0
- code_coordinator-0.5.310/code_coordinator.egg-info/scm_version.json +0 -8
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.gitignore +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/CLAUDE.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/GOAL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/LICENSE +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/MANIFEST.in +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/README.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/__init__.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agent.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/audit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/block_log.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/board_service.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/brain.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/claim.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/cli.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/client.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/comments.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/config.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dao.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/db.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deps.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/drive.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/events.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/filelock.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/freshness.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/gates.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/goal.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/context.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/models.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/render.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/units.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/hooks.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/interactive.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/models.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/network.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notify.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/openapi.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/parentage.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/plans.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/progress.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/release_window.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/reports.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/review.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/self_health.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/smoke.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/split_work.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/sql.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/state.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/test_author.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/test_report.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/usage.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/install-agent.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/pyproject.toml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/setup.cfg +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/__init__.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/backends.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/conftest.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_db.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_events.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_init.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_models.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_network.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_session.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_split.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_state.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/write_parity.py +0 -0
|
@@ -24,7 +24,13 @@ def _print_housekeeping_result(resp: dict) -> None:
|
|
|
24
24
|
archived_a = resp.get("archived_assignments", 0)
|
|
25
25
|
archived_n = resp.get("archived_notifications", 0)
|
|
26
26
|
days = resp.get("retention_days")
|
|
27
|
-
|
|
27
|
+
# #2974: the confirm-worktree sweep runs on its own age window,
|
|
28
|
+
# independent of `retention_days` above, and must be reported even when
|
|
29
|
+
# there was nothing terminal to archive — that used to be the ONLY thing
|
|
30
|
+
# this sweep did, so a run that only reclaimed leaked worktrees must not
|
|
31
|
+
# print "nothing to archive" and hide it.
|
|
32
|
+
removed_wt = resp.get("removed_confirm_worktrees", 0)
|
|
33
|
+
if not archived_a and not archived_n and not removed_wt:
|
|
28
34
|
click.echo(
|
|
29
35
|
f"housekeeping: nothing to archive (no terminal rows older than {days}d)."
|
|
30
36
|
)
|
|
@@ -35,6 +41,12 @@ def _print_housekeeping_result(resp: dict) -> None:
|
|
|
35
41
|
f"housekeeping: {verb} {archived_a} assignment(s) + "
|
|
36
42
|
f"{archived_n} notification(s) (terminal, older than {days}d).{suffix}"
|
|
37
43
|
)
|
|
44
|
+
if removed_wt:
|
|
45
|
+
wt_verb = "would remove" if dry else "removed"
|
|
46
|
+
click.echo(
|
|
47
|
+
f"housekeeping: {wt_verb} {removed_wt} stale confirm-worktree(s) "
|
|
48
|
+
"(#2974)."
|
|
49
|
+
)
|
|
38
50
|
|
|
39
51
|
|
|
40
52
|
@click.command(
|
|
@@ -104,6 +104,7 @@ existed.
|
|
|
104
104
|
from __future__ import annotations
|
|
105
105
|
|
|
106
106
|
import os
|
|
107
|
+
import shutil
|
|
107
108
|
import subprocess
|
|
108
109
|
import threading
|
|
109
110
|
import time
|
|
@@ -484,6 +485,106 @@ def confirm_lock_path(repo_name: str, branch: str) -> Path:
|
|
|
484
485
|
return COORD_DIR / "confirm-worktrees" / f"{safe}.lock"
|
|
485
486
|
|
|
486
487
|
|
|
488
|
+
#: #2974: default age (hours) a directory under ``confirm-worktrees/`` may sit
|
|
489
|
+
#: unremoved before :func:`sweep_stale_confirm_worktrees` reclaims it outright.
|
|
490
|
+
#: Every entry under that root is throwaway by construction (#561) and
|
|
491
|
+
#: `confirm_branch`'s own `finally` now removes its worktree on every exit —
|
|
492
|
+
#: so anything still here this long survived something worse than an ordinary
|
|
493
|
+
#: failure (a hard kill of the whole process, `coord-agent`/`coord-serve`
|
|
494
|
+
#: restarting mid-run before #2974's `finally` fix ever ran, a full disk
|
|
495
|
+
#: mid-cleanup). Generous relative to :data:`CONFIRM_DEFAULT_TIMEOUT_SECONDS`
|
|
496
|
+
#: (20 min) so this never races a confirmation that is still legitimately
|
|
497
|
+
#: in flight.
|
|
498
|
+
#:
|
|
499
|
+
#: Footgun to remember if either ceiling ever moves: the margin here is
|
|
500
|
+
#: relative, not enforced. `sweep_stale_confirm_worktrees` doesn't know
|
|
501
|
+
#: whether a given `confirm-worktrees/<repo>-<branch>` entry has a
|
|
502
|
+
#: `confirm_branch` call still running against it — it reclaims purely on
|
|
503
|
+
#: directory mtime. If `CONFIRM_DEFAULT_TIMEOUT_SECONDS` (or a future
|
|
504
|
+
#: per-repo override of it) is ever raised to within a few hours of this
|
|
505
|
+
#: constant, a still-in-flight confirmation's worktree (and its `.lock`
|
|
506
|
+
#: file) could be `rmtree`'d out from under it by this sweep. Keep this
|
|
507
|
+
#: comfortably above whatever the longest configured confirmation timeout
|
|
508
|
+
#: is, not just the current default.
|
|
509
|
+
STALE_WORKTREE_MAX_AGE_HOURS = 6.0
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
def sweep_stale_confirm_worktrees(
|
|
513
|
+
*,
|
|
514
|
+
max_age_hours: float = STALE_WORKTREE_MAX_AGE_HOURS,
|
|
515
|
+
dry_run: bool = False,
|
|
516
|
+
now: float | None = None,
|
|
517
|
+
) -> dict:
|
|
518
|
+
"""Reclaim ``confirm-worktrees/`` entries older than *max_age_hours* (#2974).
|
|
519
|
+
|
|
520
|
+
Belt-and-suspenders over the `finally`-based cleanup in
|
|
521
|
+
:func:`confirm_branch`: that fix stops the leak going forward, but does
|
|
522
|
+
nothing about the hundreds of directories (189G measured on one host,
|
|
523
|
+
#2974) a build that never reaches this fix — or any future bug in the
|
|
524
|
+
cleanup path itself — can still leave behind. This sweep is the backstop
|
|
525
|
+
that ages them out regardless of cause.
|
|
526
|
+
|
|
527
|
+
Deliberately filesystem-only: it reclaims disk with a plain
|
|
528
|
+
``shutil.rmtree`` keyed on directory mtime, and does **not** attempt a
|
|
529
|
+
``git worktree prune`` in the originating repo's checkout (that would
|
|
530
|
+
need to map each ``<repo>-<branch>`` directory name back to a configured
|
|
531
|
+
repo, which is ambiguous when a repo or branch name itself contains a
|
|
532
|
+
``-``). The admin metadata that leaves behind in the base checkout's
|
|
533
|
+
``.git/worktrees/`` is a few KB per entry — negligible next to the build
|
|
534
|
+
trees this reclaims — and self-heals the next time :func:`confirm_branch`
|
|
535
|
+
or :func:`coord.revalidate.revalidate` runs `git worktree prune` for that
|
|
536
|
+
repo anyway.
|
|
537
|
+
|
|
538
|
+
Called from :func:`coord.housekeeping.sweep`'s existing low-cadence
|
|
539
|
+
daemon tick and ``coord housekeeping``, so it needs no new wiring or
|
|
540
|
+
schedule of its own. Returns
|
|
541
|
+
``{"removed": [names], "dry_run": bool, "max_age_hours": float}`` —
|
|
542
|
+
``removed`` lists what was (or, for ``dry_run``, would be) deleted.
|
|
543
|
+
Silently a no-op if the directory does not exist yet.
|
|
544
|
+
"""
|
|
545
|
+
from coord.state import COORD_DIR # noqa: PLC0415
|
|
546
|
+
|
|
547
|
+
root = COORD_DIR / "confirm-worktrees"
|
|
548
|
+
result: dict = {
|
|
549
|
+
"removed": [],
|
|
550
|
+
"dry_run": dry_run,
|
|
551
|
+
"max_age_hours": max_age_hours,
|
|
552
|
+
}
|
|
553
|
+
if not root.exists():
|
|
554
|
+
return result
|
|
555
|
+
|
|
556
|
+
cutoff = (now if now is not None else time.time()) - max_age_hours * 3600.0
|
|
557
|
+
try:
|
|
558
|
+
entries = sorted(root.iterdir())
|
|
559
|
+
except OSError:
|
|
560
|
+
return result
|
|
561
|
+
|
|
562
|
+
for entry in entries:
|
|
563
|
+
# Lock files (`confirm_lock_path`) are tiny and self-explanatory by
|
|
564
|
+
# name; only the worktree directories themselves are the disk cost
|
|
565
|
+
# this sweep exists to reclaim. A stray lock with no matching
|
|
566
|
+
# worktree directory is harmless — the next `confirm_branch` call for
|
|
567
|
+
# that (repo, branch) simply re-creates and re-locks it.
|
|
568
|
+
if entry.name.endswith(".lock") or not entry.is_dir():
|
|
569
|
+
continue
|
|
570
|
+
try:
|
|
571
|
+
mtime = entry.stat().st_mtime
|
|
572
|
+
except OSError:
|
|
573
|
+
continue
|
|
574
|
+
if mtime >= cutoff:
|
|
575
|
+
continue
|
|
576
|
+
result["removed"].append(entry.name)
|
|
577
|
+
if dry_run:
|
|
578
|
+
continue
|
|
579
|
+
shutil.rmtree(entry, ignore_errors=True)
|
|
580
|
+
lock_path = root / f"{entry.name}.lock"
|
|
581
|
+
try:
|
|
582
|
+
lock_path.unlink(missing_ok=True)
|
|
583
|
+
except OSError:
|
|
584
|
+
pass
|
|
585
|
+
return result
|
|
586
|
+
|
|
587
|
+
|
|
487
588
|
def branch_touched_files(repo_dir: Path, branch: str, base_branch: str) -> list[str]:
|
|
488
589
|
"""Paths the branch changes vs its merge-base with *base_branch*.
|
|
489
590
|
|
|
@@ -915,9 +1016,9 @@ def confirm_branch(
|
|
|
915
1016
|
test_command,
|
|
916
1017
|
)
|
|
917
1018
|
|
|
918
|
-
# Green, and observed rather than reported.
|
|
919
|
-
#
|
|
920
|
-
|
|
1019
|
+
# Green, and observed rather than reported. Nothing to inspect —
|
|
1020
|
+
# cleanup happens in `finally` below, same as every other exit from
|
|
1021
|
+
# this block.
|
|
921
1022
|
return ConfirmationResult(
|
|
922
1023
|
kind=KIND_OK,
|
|
923
1024
|
reason=(
|
|
@@ -928,6 +1029,31 @@ def confirm_branch(
|
|
|
928
1029
|
returncode=0,
|
|
929
1030
|
)
|
|
930
1031
|
finally:
|
|
1032
|
+
# #2974: EVERY exit from the block above — including KIND_TIMEOUT
|
|
1033
|
+
# (a hung/slow suite), KIND_SIGNAL (a coord-agent/coord-serve restart
|
|
1034
|
+
# landing mid-run, #2527), and a genuine refutation (KIND_BUILD/
|
|
1035
|
+
# KIND_SUITE) — must remove this worktree, not just the green path.
|
|
1036
|
+
#
|
|
1037
|
+
# `coord.revalidate`'s sibling helper deliberately KEEPS a failed
|
|
1038
|
+
# worktree "for inspection" (see its `_remove_worktree` docstring and
|
|
1039
|
+
# `format_failure`'s "worktree kept for inspection" line) because
|
|
1040
|
+
# `coord merge --revalidate` is opt-in, operator-initiated, and rare —
|
|
1041
|
+
# a human is watching and can go look at the tree it names.
|
|
1042
|
+
# `confirm_branch` is the opposite shape: it runs unattended, on every
|
|
1043
|
+
# PASS claim, inside the automatic reap path, keyed by (repo, branch)
|
|
1044
|
+
# — and a branch is rarely revisited, so nothing was ever going to
|
|
1045
|
+
# remove a "kept for inspection" tree here. That is exactly how this
|
|
1046
|
+
# leaked to 189G / 346 dirs on one host in nine days (#2974): the
|
|
1047
|
+
# biggest trees came from the slowest repos, i.e. precisely the
|
|
1048
|
+
# KIND_TIMEOUT/KIND_SIGNAL runs that used to fall through this
|
|
1049
|
+
# `finally` without cleanup.
|
|
1050
|
+
#
|
|
1051
|
+
# Nothing of diagnostic value is lost: the captured output tail
|
|
1052
|
+
# (`ConfirmationResult.output`) is already persisted to
|
|
1053
|
+
# `test_output/<assignment_id>.txt` by `write_confirmation_output`
|
|
1054
|
+
# regardless of outcome — the worktree itself was never the thing an
|
|
1055
|
+
# operator actually inspected.
|
|
1056
|
+
_remove_worktree(repo_dir, wt_path)
|
|
931
1057
|
lock.release()
|
|
932
1058
|
|
|
933
1059
|
|
|
@@ -942,6 +1068,7 @@ __all__ = [
|
|
|
942
1068
|
"NOTIFY_BASE_CLIENT_TIMEOUT_SECONDS",
|
|
943
1069
|
"PERMISSION_DENIED_EXIT",
|
|
944
1070
|
"REFUTING_KINDS",
|
|
1071
|
+
"STALE_WORKTREE_MAX_AGE_HOURS",
|
|
945
1072
|
"ConfirmationResult",
|
|
946
1073
|
"begin_confirmation_pass",
|
|
947
1074
|
"branch_touched_files",
|
|
@@ -952,6 +1079,7 @@ __all__ = [
|
|
|
952
1079
|
"confirmation_timeout",
|
|
953
1080
|
"notify_client_timeout_seconds",
|
|
954
1081
|
"spend_confirmation_budget",
|
|
1082
|
+
"sweep_stale_confirm_worktrees",
|
|
955
1083
|
"unmet_confirmation_capabilities",
|
|
956
1084
|
"write_confirmation_output",
|
|
957
1085
|
]
|
|
@@ -2302,12 +2302,20 @@ class UnreachableWait:
|
|
|
2302
2302
|
evidence a genuine transient wouldn't have, and `last_reason` is
|
|
2303
2303
|
whatever the last sweep to touch this row recorded — useful context,
|
|
2304
2304
|
never re-interpreted here.
|
|
2305
|
+
|
|
2306
|
+
`dependents` (#2978) is the count of OTHER queue entries whose `after=`
|
|
2307
|
+
names this one — computed against the full entry set the caller passed
|
|
2308
|
+
to :func:`detect_unreachable_waits`, not just the flagged subset, so it
|
|
2309
|
+
is accurate even though those dependents themselves never appear in the
|
|
2310
|
+
result (see the predicate's own docstring for why). `0` for an entry
|
|
2311
|
+
nothing is chained behind.
|
|
2305
2312
|
"""
|
|
2306
2313
|
|
|
2307
2314
|
key: str
|
|
2308
2315
|
state: str
|
|
2309
2316
|
deferrals: int
|
|
2310
2317
|
last_reason: str
|
|
2318
|
+
dependents: int = 0
|
|
2311
2319
|
|
|
2312
2320
|
|
|
2313
2321
|
def detect_unreachable_waits(
|
|
@@ -2317,35 +2325,73 @@ def detect_unreachable_waits(
|
|
|
2317
2325
|
) -> list[UnreachableWait]:
|
|
2318
2326
|
"""Entries sitting in the #2944 guaranteed-false wait.
|
|
2319
2327
|
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2328
|
+
Two independent shapes, either of which qualifies a `blocked`/`parked`
|
|
2329
|
+
entry — both provably have no branch/PR/merge-queue row for any sweep to
|
|
2330
|
+
ever form an opinion about, which is the actual invariant this predicate
|
|
2331
|
+
is checking, not "attempts == 0" as a proxy for it (#2978 found the proxy
|
|
2332
|
+
wrong for the second shape):
|
|
2333
|
+
|
|
2334
|
+
* ``attempts == 0`` and ``deferrals > min_deferrals`` — never dispatched
|
|
2335
|
+
at all. The original #2944 shape.
|
|
2336
|
+
* ``attempts > 0``, ``state == blocked``, and the entry's own
|
|
2337
|
+
`last_reason` carries #2273's "no assignment was ever created for this
|
|
2338
|
+
run" marker (:func:`_is_dispatch_failure_reason`) — every dispatch
|
|
2339
|
+
attempt died before `coord assign` produced a board-visible row, and
|
|
2340
|
+
the entry has now exhausted its retry budget (the only way to reach
|
|
2341
|
+
`blocked` with that reason: see `_reconcile_running`'s `exhausted`
|
|
2342
|
+
branch). Exhaustion is its own grace period — there is no next attempt
|
|
2343
|
+
left to wait out — so `min_deferrals` is not applied here.
|
|
2344
|
+
|
|
2345
|
+
A `blocked`/`parked` entry whose `last_reason` is instead one of
|
|
2346
|
+
`_resolve_prereqs`'s unsatisfiable-`after=` verdict shapes
|
|
2347
|
+
(:func:`_is_unsatisfiable_prereq_reason`) is excluded UNCONDITIONALLY,
|
|
2348
|
+
regardless of attempts/deferrals — #2978: that shape is
|
|
2349
|
+
:func:`_reconcile_blocked_after`'s to resolve (#2362, widened #2756),
|
|
2350
|
+
not an operator's, and flagging it here directly contradicts that
|
|
2351
|
+
function's own documented behaviour. This is what keeps a chain's
|
|
2352
|
+
dependents (each blocked with "pre-req X is queued but blocked — it will
|
|
2353
|
+
never satisfy") out of the result entirely, leaving only the root that
|
|
2354
|
+
actually needs a human.
|
|
2355
|
+
|
|
2356
|
+
Pure and cheap (a predicate over already-loaded rows, no clock, no I/O),
|
|
2357
|
+
so the same function backs both `coord drive-queue status`'s `alert:`
|
|
2358
|
+
line (`coord.commands.drive_queue._queue_alert`) and the `coord doctor`
|
|
2359
|
+
WARN (`coord.health.checks.wedged_drive_queue`) — one definition of
|
|
2360
|
+
"wedged", not two that could drift apart.
|
|
2333
2361
|
"""
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2362
|
+
entries = list(entries)
|
|
2363
|
+
dependents_of: dict[str, int] = {}
|
|
2364
|
+
for e in entries:
|
|
2365
|
+
for dep in e.after:
|
|
2366
|
+
dependents_of[dep] = dependents_of.get(dep, 0) + 1
|
|
2367
|
+
|
|
2368
|
+
waits: list[UnreachableWait] = []
|
|
2369
|
+
for e in entries:
|
|
2370
|
+
if e.state not in (STATE_BLOCKED, STATE_PARKED):
|
|
2371
|
+
continue
|
|
2372
|
+
if _is_unsatisfiable_prereq_reason(e.last_reason):
|
|
2373
|
+
continue
|
|
2374
|
+
if e.attempts == 0:
|
|
2375
|
+
if e.deferrals <= min_deferrals:
|
|
2376
|
+
continue
|
|
2377
|
+
elif not (e.state == STATE_BLOCKED and _is_dispatch_failure_reason(e.last_reason)):
|
|
2378
|
+
continue
|
|
2379
|
+
waits.append(
|
|
2380
|
+
UnreachableWait(
|
|
2381
|
+
key=e.key,
|
|
2382
|
+
state=e.state,
|
|
2383
|
+
deferrals=e.deferrals,
|
|
2384
|
+
last_reason=e.last_reason,
|
|
2385
|
+
dependents=dependents_of.get(e.key, 0),
|
|
2386
|
+
)
|
|
2337
2387
|
)
|
|
2338
|
-
|
|
2339
|
-
if e.state in (STATE_BLOCKED, STATE_PARKED)
|
|
2340
|
-
and e.attempts == 0
|
|
2341
|
-
and e.deferrals > min_deferrals
|
|
2342
|
-
]
|
|
2388
|
+
return waits
|
|
2343
2389
|
|
|
2344
2390
|
|
|
2345
2391
|
def unreachable_wait_alert(waits: Sequence[UnreachableWait]) -> QueueAlert:
|
|
2346
2392
|
"""The queue-level record #2944's predicate raises, in :func:`_hold_alert`'s
|
|
2347
|
-
shape — a message naming the entry (or entries), the
|
|
2348
|
-
|
|
2393
|
+
shape — a message naming the entry (or entries), the evidence that
|
|
2394
|
+
qualified it, and the ONE remedy that actually clears it.
|
|
2349
2395
|
|
|
2350
2396
|
``add`` alone does not clear ``blocked`` (the queue list already
|
|
2351
2397
|
documents this as a footgun elsewhere) — only ``remove`` then ``add``
|
|
@@ -2357,29 +2403,52 @@ def unreachable_wait_alert(waits: Sequence[UnreachableWait]) -> QueueAlert:
|
|
|
2357
2403
|
``gate_readings``/``details`` lines are printed) so the remedy is visible
|
|
2358
2404
|
wherever this alert's ``reason`` is, not just to a caller that also reads
|
|
2359
2405
|
the structured field.
|
|
2406
|
+
|
|
2407
|
+
#2978: each name also carries its `dependents` count when non-zero — the
|
|
2408
|
+
entries chained behind a flagged root never appear in `waits` (see
|
|
2409
|
+
`detect_unreachable_waits`), so without this an operator has no way to
|
|
2410
|
+
know a fix to the one row named here will also resolve N others they
|
|
2411
|
+
never see mentioned. Explicitly says those dependents need no remedy of
|
|
2412
|
+
their own, since #2944's original wording ("for each entry named above")
|
|
2413
|
+
read, on a real incident, as an instruction to `remove`+`add` entries
|
|
2414
|
+
that were never named — but easy to mis-generalize to "the dependents
|
|
2415
|
+
too" by an operator who does not already know #2756 self-heals them.
|
|
2360
2416
|
"""
|
|
2361
|
-
|
|
2362
|
-
f"{w.key} ({w.state}, {w.deferrals} deferrals)"
|
|
2363
|
-
|
|
2417
|
+
def _name(w: UnreachableWait) -> str:
|
|
2418
|
+
base = f"{w.key} ({w.state}, {w.deferrals} deferrals)"
|
|
2419
|
+
if w.dependents:
|
|
2420
|
+
plural = "ies" if w.dependents != 1 else "y"
|
|
2421
|
+
base += (
|
|
2422
|
+
f" — {w.dependents} dependent entr{plural} chained behind it "
|
|
2423
|
+
"will self-heal automatically once this clears (#2756), no "
|
|
2424
|
+
"remedy needed on them"
|
|
2425
|
+
)
|
|
2426
|
+
return base
|
|
2427
|
+
|
|
2428
|
+
names = ", ".join(_name(w) for w in waits[:5])
|
|
2364
2429
|
more = ", ..." if len(waits) > 5 else ""
|
|
2365
2430
|
plural = len(waits) != 1
|
|
2366
2431
|
return QueueAlert(
|
|
2367
2432
|
reason=(
|
|
2368
2433
|
f"{len(waits)} queue entr{'ies' if plural else 'y'} stuck in a "
|
|
2369
|
-
"guaranteed-false wait —
|
|
2370
|
-
|
|
2434
|
+
"guaranteed-false wait — blocked/parked with no branch/PR/"
|
|
2435
|
+
"merge-queue row any sweep could ever act on (never dispatched, "
|
|
2436
|
+
"or every dispatch attempt died before creating an assignment); "
|
|
2371
2437
|
f"no sweep can ever clear this on its own: {names}{more}. Fix: "
|
|
2372
2438
|
"coord drive-queue remove <repo> <issue> && "
|
|
2373
|
-
"coord drive-queue add <repo> <issue> for each entry named
|
|
2439
|
+
"coord drive-queue add <repo> <issue> for each ROOT entry named "
|
|
2440
|
+
"above — never on a dependent chained behind one."
|
|
2374
2441
|
),
|
|
2375
2442
|
details=tuple(
|
|
2376
2443
|
f"{w.key}: {w.state}, {w.deferrals} deferrals, "
|
|
2377
|
-
f"last_reason={w.last_reason!r}"
|
|
2444
|
+
f"dependents={w.dependents}, last_reason={w.last_reason!r}"
|
|
2378
2445
|
for w in waits
|
|
2379
2446
|
),
|
|
2380
2447
|
command=(
|
|
2381
2448
|
"coord drive-queue remove <repo> <issue> && "
|
|
2382
|
-
"coord drive-queue add <repo> <issue> — for each entry
|
|
2449
|
+
"coord drive-queue add <repo> <issue> — for each ROOT entry "
|
|
2450
|
+
"named above; any dependents chained behind it self-heal on "
|
|
2451
|
+
"their own (#2756)"
|
|
2383
2452
|
),
|
|
2384
2453
|
)
|
|
2385
2454
|
|
{code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/wedged_drive_queue.py
RENAMED
|
@@ -19,6 +19,15 @@ so this check and that line can never say different things) — this probe
|
|
|
19
19
|
just re-derives it, live, from ``drive_queue`` state every time ``coord
|
|
20
20
|
doctor`` runs, independent of whatever the last tick happened to report.
|
|
21
21
|
|
|
22
|
+
#2978: the predicate also flags an ``attempts > 0`` entry that exhausted its
|
|
23
|
+
retry budget without ever getting a #2273 dispatch-layer death past `coord
|
|
24
|
+
assign` (same "no branch/PR ever existed" invariant, just reached a
|
|
25
|
+
different way) — and excludes an entry blocked solely on an unsatisfiable
|
|
26
|
+
``after=`` pre-req, since that one is ``_reconcile_blocked_after``'s to
|
|
27
|
+
self-heal (#2362/#2756), not an operator's. See
|
|
28
|
+
``coord.drive_queue.detect_unreachable_waits`` for the exact predicate; this
|
|
29
|
+
probe does not duplicate it, only renders its result.
|
|
30
|
+
|
|
22
31
|
This is deliberately independent of #2935 (which fixes the specific sweep
|
|
23
32
|
that produced the #2900/#2907 incident) and #2230 (the sweep's origin): both
|
|
24
33
|
are about *why* a row gets wedged this way; this check is about the row
|
|
@@ -51,16 +60,19 @@ from coord.health.registry import COST_NETWORK, check
|
|
|
51
60
|
cost=COST_NETWORK,
|
|
52
61
|
description=(
|
|
53
62
|
"Drive-queue rows in `coord.drive_queue`'s #2944 guaranteed-false "
|
|
54
|
-
"wait: `blocked`/`parked
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"`release_cordon
|
|
63
|
+
"wait: `blocked`/`parked` with no branch/PR/merge-queue row any "
|
|
64
|
+
"sweep could ever act on — either `attempts == 0` (never dispatched) "
|
|
65
|
+
"past a few ticks of grace, or `attempts > 0` with an exhausted "
|
|
66
|
+
"#2273 dispatch-layer death (#2978). Excludes an entry blocked "
|
|
67
|
+
"solely on an unsatisfiable `after=` pre-req — that one is "
|
|
68
|
+
"`_reconcile_blocked_after`'s to self-heal (#2756), not an "
|
|
69
|
+
"operator's. Reads via `coord.state.list_drive_queue`, which — per "
|
|
70
|
+
"its own docstring — routes to the daemon over HTTP when "
|
|
71
|
+
"`board_service` is set (the common case on a thin-client fleet "
|
|
72
|
+
"machine, see `release_cordon.py`) and only reads the local DB "
|
|
73
|
+
"directly otherwise; `cost=network` so `--no-network`/timer runs "
|
|
74
|
+
"and the automatic per-agent health poll skip it exactly like the "
|
|
75
|
+
"other network-costed checks, same precedent as `release_cordon`."
|
|
64
76
|
),
|
|
65
77
|
)
|
|
66
78
|
def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
|
|
@@ -92,7 +104,10 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
|
|
|
92
104
|
)
|
|
93
105
|
|
|
94
106
|
sample = ", ".join(
|
|
95
|
-
f"{w.key} ({w.state}, {w.deferrals} deferrals
|
|
107
|
+
f"{w.key} ({w.state}, {w.deferrals} deferrals"
|
|
108
|
+
+ (f", {w.dependents} dependents self-heal (#2756)" if w.dependents else "")
|
|
109
|
+
+ ")"
|
|
110
|
+
for w in waits[:5]
|
|
96
111
|
)
|
|
97
112
|
return CheckResult(
|
|
98
113
|
check_id="wedged_drive_queue",
|
|
@@ -104,11 +119,17 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
|
|
|
104
119
|
),
|
|
105
120
|
detail=(
|
|
106
121
|
f"e.g. {sample}" + (", ..." if len(waits) > 5 else "")
|
|
107
|
-
+ " —
|
|
108
|
-
"
|
|
109
|
-
"
|
|
122
|
+
+ " — no branch/PR/merge-queue row any sweep could ever act on "
|
|
123
|
+
"(never dispatched, or every dispatch attempt died before "
|
|
124
|
+
"creating an assignment); cannot clear on its own. fix (root "
|
|
125
|
+
"only — any dependents self-heal, #2756): coord drive-queue "
|
|
126
|
+
"remove <repo> <issue> && coord drive-queue add <repo> <issue>"
|
|
127
|
+
),
|
|
128
|
+
threshold=(
|
|
129
|
+
"warn when any entry is blocked/parked with no branch/PR a sweep "
|
|
130
|
+
"could ever act on: attempts=0 past a few ticks of grace, or "
|
|
131
|
+
"attempts>0 with an exhausted #2273 dispatch-layer death"
|
|
110
132
|
),
|
|
111
|
-
threshold="warn when any entry is blocked/parked, attempts=0, past a few ticks of grace",
|
|
112
133
|
values={
|
|
113
134
|
"count": len(waits),
|
|
114
135
|
"entries": [
|
|
@@ -116,6 +137,7 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
|
|
|
116
137
|
"key": w.key,
|
|
117
138
|
"state": w.state,
|
|
118
139
|
"deferrals": w.deferrals,
|
|
140
|
+
"dependents": w.dependents,
|
|
119
141
|
"last_reason": w.last_reason,
|
|
120
142
|
}
|
|
121
143
|
for w in waits
|
|
@@ -33,6 +33,14 @@ declog. ``coord.merge_queue.merged_issue_keys()`` unions the live table with
|
|
|
33
33
|
the archive so the "already merged, don't re-enqueue" dedup in
|
|
34
34
|
``enqueue_approved_work``/``staging_items`` keeps working after a row ages
|
|
35
35
|
out.
|
|
36
|
+
|
|
37
|
+
#2974: this is also the one existing low-cadence, filesystem-safe hook the
|
|
38
|
+
daemon already calls on a timer (and that ``coord housekeeping`` calls on
|
|
39
|
+
demand) — so it is where :func:`coord.confirm_test.sweep_stale_confirm_worktrees`
|
|
40
|
+
is wired in too, reclaiming ``~/.coord/confirm-worktrees/`` entries that
|
|
41
|
+
outlived ``confirm_branch``'s own per-run cleanup. That is disk hygiene, not
|
|
42
|
+
DB archiving, but reusing this sweep's cadence beats inventing a second timer
|
|
43
|
+
for a second maintenance job.
|
|
36
44
|
"""
|
|
37
45
|
|
|
38
46
|
from __future__ import annotations
|
|
@@ -140,12 +148,13 @@ def _move_rows(
|
|
|
140
148
|
|
|
141
149
|
def sweep(*, dry_run: bool = False, now: float | None = None) -> dict:
|
|
142
150
|
"""Archive stale terminal assignments + their notifications + merged
|
|
143
|
-
merge_queue entries.
|
|
151
|
+
merge_queue entries, and reclaim leaked confirm-worktree directories.
|
|
144
152
|
|
|
145
153
|
Returns ``{"archived_assignments": N, "archived_notifications": M,
|
|
146
|
-
"archived_merge_queue": K, "
|
|
147
|
-
``archived_
|
|
148
|
-
moved. A
|
|
154
|
+
"archived_merge_queue": K, "removed_confirm_worktrees": W, "dry_run": bool,
|
|
155
|
+
"retention_days": D}``. ``archived_*``/``removed_confirm_worktrees`` are
|
|
156
|
+
the counts that were (or, for ``dry_run``, would be) moved/deleted. A
|
|
157
|
+
no-op returns zeros.
|
|
149
158
|
|
|
150
159
|
Conservative by construction: nothing active, recent (within the archive
|
|
151
160
|
window), queued-for-merge, latest-of-an-open-issue, or review-linked to any
|
|
@@ -153,17 +162,29 @@ def sweep(*, dry_run: bool = False, now: float | None = None) -> dict:
|
|
|
153
162
|
are in the terminal ``MERGED`` state (#1107 Part 3) — non-terminal /
|
|
154
163
|
conflicted entries are left for ``prune_stale_queue_entries`` or manual
|
|
155
164
|
``coord merge --drop``.
|
|
165
|
+
|
|
166
|
+
#2974: ``removed_confirm_worktrees`` is independent of the DB-archiving
|
|
167
|
+
``cutoff``/``retention_days`` above (it has its own, much shorter,
|
|
168
|
+
:data:`coord.confirm_test.STALE_WORKTREE_MAX_AGE_HOURS` window) and runs
|
|
169
|
+
even when DB archiving itself is disabled (``COORD_ARCHIVE_RETENTION_DAYS``
|
|
170
|
+
``<= 0``) — a disk leak on the daemon host is not something an operator
|
|
171
|
+
who merely turned off DB archiving meant to also keep.
|
|
156
172
|
"""
|
|
173
|
+
from coord.confirm_test import sweep_stale_confirm_worktrees # noqa: PLC0415
|
|
174
|
+
|
|
175
|
+
swept_worktrees = sweep_stale_confirm_worktrees(dry_run=dry_run, now=now)
|
|
176
|
+
|
|
157
177
|
cutoff = _archive_cutoff(now)
|
|
158
178
|
result = {
|
|
159
179
|
"archived_assignments": 0,
|
|
160
180
|
"archived_notifications": 0,
|
|
161
181
|
"archived_merge_queue": 0,
|
|
182
|
+
"removed_confirm_worktrees": len(swept_worktrees["removed"]),
|
|
162
183
|
"dry_run": dry_run,
|
|
163
184
|
"retention_days": _archive_retention_days(),
|
|
164
185
|
}
|
|
165
186
|
if cutoff is None:
|
|
166
|
-
return result # archiving disabled
|
|
187
|
+
return result # DB archiving disabled; the worktree sweep above still ran
|
|
167
188
|
|
|
168
189
|
conn = get_connection()
|
|
169
190
|
index = [
|
|
@@ -739,7 +739,9 @@ def _audit_housekeeping_sweep(swept: dict) -> None:
|
|
|
739
739
|
f"housekeeping: archived {swept.get('archived_assignments', 0)} "
|
|
740
740
|
f"assignment(s), {swept.get('archived_notifications', 0)} "
|
|
741
741
|
f"notification(s), {swept.get('archived_merge_queue', 0)} "
|
|
742
|
-
"merge_queue entry(ies)"
|
|
742
|
+
"merge_queue entry(ies), removed "
|
|
743
|
+
f"{swept.get('removed_confirm_worktrees', 0)} stale "
|
|
744
|
+
"confirm-worktree(s) (#2974)"
|
|
743
745
|
),
|
|
744
746
|
details=swept,
|
|
745
747
|
)
|
|
@@ -9477,13 +9479,16 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
|
|
|
9477
9479
|
swept.get("archived_assignments")
|
|
9478
9480
|
or swept.get("archived_notifications")
|
|
9479
9481
|
or swept.get("archived_merge_queue")
|
|
9482
|
+
or swept.get("removed_confirm_worktrees")
|
|
9480
9483
|
):
|
|
9481
9484
|
log.info(
|
|
9482
9485
|
"housekeeping: archived %d assignment(s), "
|
|
9483
|
-
"%d notification(s), %d merge_queue entry(ies)"
|
|
9486
|
+
"%d notification(s), %d merge_queue entry(ies), "
|
|
9487
|
+
"removed %d stale confirm-worktree(s)",
|
|
9484
9488
|
swept["archived_assignments"],
|
|
9485
9489
|
swept["archived_notifications"],
|
|
9486
9490
|
swept.get("archived_merge_queue", 0),
|
|
9491
|
+
swept.get("removed_confirm_worktrees", 0),
|
|
9487
9492
|
)
|
|
9488
9493
|
_audit_housekeeping_sweep(swept)
|
|
9489
9494
|
except Exception: # noqa: BLE001
|
|
@@ -20,6 +20,33 @@ RECENT = NOW - 2 * 86400 # 2 days ago → inside the 14d board window
|
|
|
20
20
|
OLD = NOW - 40 * 86400 # 40 days ago → outside both windows
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
@pytest.fixture(autouse=True)
|
|
24
|
+
def _isolated_confirm_worktrees_dir(monkeypatch, tmp_path):
|
|
25
|
+
"""#2974: ``housekeeping.sweep()`` now also calls
|
|
26
|
+
``coord.confirm_test.sweep_stale_confirm_worktrees`` on every invocation
|
|
27
|
+
(even ``dry_run=False`` calls made directly, as most tests below do), and
|
|
28
|
+
that helper resolves its sweep root from the real, lazily-resolved
|
|
29
|
+
``coord.state.COORD_DIR`` (``~/.coord`` on POSIX absent a ``$COORD_DIR``
|
|
30
|
+
override). Before this fixture, every test in this file that calls the
|
|
31
|
+
real (non-dry-run) ``housekeeping.sweep()`` — or drives it through the
|
|
32
|
+
real ``/housekeeping`` endpoint — would ``shutil.rmtree`` anything under
|
|
33
|
+
the OPERATOR's real ``~/.coord/confirm-worktrees/`` older than
|
|
34
|
+
``coord.confirm_test.STALE_WORKTREE_MAX_AGE_HOURS`` as an untracked side
|
|
35
|
+
effect of running `pytest`. Pin ``coord.state.COORD_DIR`` to a private
|
|
36
|
+
``tmp_path`` for every test in this module — mirrors
|
|
37
|
+
``tests/test_confirm_test.py``'s own ``isolated_coord_dir`` fixture,
|
|
38
|
+
which the real ``sweep_stale_confirm_worktrees`` call site already
|
|
39
|
+
trusts (it re-imports ``coord.state.COORD_DIR`` fresh on every call, so
|
|
40
|
+
a plain ``monkeypatch.setattr`` here is picked up with no further
|
|
41
|
+
wiring). A file-local autouse fixture (rather than a global one in
|
|
42
|
+
``tests/conftest.py``) is deliberate: ``tests/test_platform_paths.py``
|
|
43
|
+
has real tests that assert ``coord.state.COORD_DIR`` reflects the
|
|
44
|
+
*actual* default resolution with nothing overriding it, which a global
|
|
45
|
+
override would break.
|
|
46
|
+
"""
|
|
47
|
+
monkeypatch.setattr("coord.state.COORD_DIR", tmp_path / "coord-state")
|
|
48
|
+
|
|
49
|
+
|
|
23
50
|
def _ins_assignment(
|
|
24
51
|
conn: sqlite3.Connection,
|
|
25
52
|
aid: str,
|