code-coordinator 0.5.316__tar.gz → 0.5.317__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.316 → code_coordinator-0.5.317}/PKG-INFO +1 -1
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/scm_file_list.json +2 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/reconcile.py +59 -2
- code_coordinator-0.5.317/coord/repo_dormancy.py +225 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/serve_app.py +40 -4
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/conftest.py +23 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_merges.py +137 -0
- code_coordinator-0.5.317/tests/test_repo_dormancy.py +187 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_serve.py +139 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.gitignore +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/CLAUDE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/GOAL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/LICENSE +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/MANIFEST.in +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/README.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agent.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/block_log.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/board_service.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/brain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/claim.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/client.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/comments.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dao.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/db.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deps.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/drive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/events.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/filelock.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/freshness.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/gates.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/goal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/context.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/models.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/render.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/units.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/hooks.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/interactive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/models.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/network.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/openapi.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/parentage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/plans.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/progress.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/release_window.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/reports.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/review.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/self_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/smoke.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/split_work.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/sql.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/test_author.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/test_report.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/usage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/install-agent.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/pyproject.toml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/setup.cfg +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/backends.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_db.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_events.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_init.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_models.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_network.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_session.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_split.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/write_parity.py +0 -0
|
@@ -126,6 +126,7 @@ coord/release_cordon.py
|
|
|
126
126
|
coord/release_propagate.py
|
|
127
127
|
coord/release_verify.py
|
|
128
128
|
coord/release_window.py
|
|
129
|
+
coord/repo_dormancy.py
|
|
129
130
|
coord/repo_edit.py
|
|
130
131
|
coord/repo_onboard.py
|
|
131
132
|
coord/reports.py
|
|
@@ -706,6 +707,7 @@ tests/test_release_window.py
|
|
|
706
707
|
tests/test_remote_auto_prune.py
|
|
707
708
|
tests/test_remote_interactive_reaper.py
|
|
708
709
|
tests/test_repo_add.py
|
|
710
|
+
tests/test_repo_dormancy.py
|
|
709
711
|
tests/test_repo_edit_2220.py
|
|
710
712
|
tests/test_repo_graph_fleet_2237.py
|
|
711
713
|
tests/test_repo_onboard_2220.py
|
{code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -231,6 +231,7 @@
|
|
|
231
231
|
"coord/release_propagate.py",
|
|
232
232
|
"coord/release_verify.py",
|
|
233
233
|
"coord/release_window.py",
|
|
234
|
+
"coord/repo_dormancy.py",
|
|
234
235
|
"coord/repo_edit.py",
|
|
235
236
|
"coord/repo_onboard.py",
|
|
236
237
|
"coord/reports.py",
|
|
@@ -732,6 +733,7 @@
|
|
|
732
733
|
"tests/test_remote_auto_prune.py",
|
|
733
734
|
"tests/test_remote_interactive_reaper.py",
|
|
734
735
|
"tests/test_repo_add.py",
|
|
736
|
+
"tests/test_repo_dormancy.py",
|
|
735
737
|
"tests/test_repo_edit_2220.py",
|
|
736
738
|
"tests/test_repo_graph_fleet_2237.py",
|
|
737
739
|
"tests/test_repo_onboard_2220.py",
|
|
@@ -2791,9 +2791,11 @@ def _extract_issue_number(branch: str) -> int | None:
|
|
|
2791
2791
|
def close_stale_prs(
|
|
2792
2792
|
config: Config,
|
|
2793
2793
|
*,
|
|
2794
|
+
board: Board | None = None,
|
|
2794
2795
|
repo: str | None = None,
|
|
2795
2796
|
issue: int | None = None,
|
|
2796
2797
|
dry_run: bool = False,
|
|
2798
|
+
skip_dormant_repos: bool = False,
|
|
2797
2799
|
) -> list[str]:
|
|
2798
2800
|
"""Close open PRs whose work is already on main or whose issue is closed.
|
|
2799
2801
|
|
|
@@ -2808,15 +2810,46 @@ def close_stale_prs(
|
|
|
2808
2810
|
|
|
2809
2811
|
Stale PRs are closed with an explanatory comment. Non-stale PRs are left
|
|
2810
2812
|
untouched. *dry_run* lists what would change without writing. Idempotent.
|
|
2813
|
+
|
|
2814
|
+
#2994: when *skip_dormant_repos* is set (the daemon tick's opt-in — see
|
|
2815
|
+
``coord.serve_app._reconcile_merges_tick``; a manual ``coord
|
|
2816
|
+
reconcile-merges`` leaves this False), a repo with no open assignment, no
|
|
2817
|
+
drive-queue entry, and no coord-authored open PR (``coord.repo_dormancy.
|
|
2818
|
+
should_skip_sweep``) is skipped this call rather than costing a
|
|
2819
|
+
``list_open_prs`` call — bounded by ``coord.repo_dormancy.
|
|
2820
|
+
DORMANT_SWEEP_FLOOR_S`` so it's still swept eventually. Requires *board*
|
|
2821
|
+
to evaluate; with *board* left ``None`` this is a no-op regardless of
|
|
2822
|
+
*skip_dormant_repos* (no activity signal to check against, so never
|
|
2823
|
+
skip).
|
|
2824
|
+
|
|
2825
|
+
Note: the floor is recorded as soon as a repo is deemed due, before
|
|
2826
|
+
``list_open_prs`` is even attempted, and it stays recorded if that call
|
|
2827
|
+
then raises (deliberate — see ``coord.repo_dormancy.record_swept``'s
|
|
2828
|
+
docstring: it tracks "a real gh call was spent", not "and it worked").
|
|
2829
|
+
One operator-facing consequence: a repo that is persistently failing
|
|
2830
|
+
(renamed, deleted, secondary-rate-limited) goes quiet for up to
|
|
2831
|
+
``DORMANT_SWEEP_FLOOR_S`` between retries rather than being retried
|
|
2832
|
+
sooner, same as a genuinely idle repo would be.
|
|
2811
2833
|
"""
|
|
2812
2834
|
from coord import github_ops # noqa: PLC0415
|
|
2813
2835
|
|
|
2814
2836
|
actions: list[str] = []
|
|
2837
|
+
dormant_skipped = 0
|
|
2815
2838
|
|
|
2816
2839
|
for repo_cfg in config.repos:
|
|
2817
2840
|
if repo is not None and repo_cfg.name != repo:
|
|
2818
2841
|
continue
|
|
2819
2842
|
|
|
2843
|
+
if skip_dormant_repos and board is not None:
|
|
2844
|
+
from coord import repo_dormancy # noqa: PLC0415
|
|
2845
|
+
|
|
2846
|
+
if repo_dormancy.should_skip_sweep(
|
|
2847
|
+
repo_cfg.name, board, repo_dormancy.KIND_PRS
|
|
2848
|
+
):
|
|
2849
|
+
dormant_skipped += 1
|
|
2850
|
+
continue
|
|
2851
|
+
repo_dormancy.record_swept(repo_cfg.name, repo_dormancy.KIND_PRS)
|
|
2852
|
+
|
|
2820
2853
|
try:
|
|
2821
2854
|
open_prs = github_ops.list_open_prs(repo_cfg.github)
|
|
2822
2855
|
except Exception as exc: # noqa: BLE001
|
|
@@ -2891,6 +2924,14 @@ def close_stale_prs(
|
|
|
2891
2924
|
except Exception as exc: # noqa: BLE001
|
|
2892
2925
|
actions.append(f" ↳ error closing PR #{pr_number}: {exc}")
|
|
2893
2926
|
|
|
2927
|
+
if dormant_skipped:
|
|
2928
|
+
# #2994: one aggregate line rather than one per repo — visible
|
|
2929
|
+
# without being noisy on a fleet with many idle repos.
|
|
2930
|
+
actions.append(
|
|
2931
|
+
f"stale-PR sweep: skipped {dormant_skipped} dormant repo(s) "
|
|
2932
|
+
"(no open assignment, drive-queue entry, or open PR)"
|
|
2933
|
+
)
|
|
2934
|
+
|
|
2894
2935
|
return actions
|
|
2895
2936
|
|
|
2896
2937
|
|
|
@@ -2926,6 +2967,7 @@ def reconcile_board_merges(
|
|
|
2926
2967
|
issue: int | None = None,
|
|
2927
2968
|
dry_run: bool = False,
|
|
2928
2969
|
throttle_false_merge_audit: bool = False,
|
|
2970
|
+
skip_dormant_repos: bool = False,
|
|
2929
2971
|
) -> list[str]:
|
|
2930
2972
|
"""Reconcile done work assignments against git/GitHub reality.
|
|
2931
2973
|
|
|
@@ -2995,7 +3037,13 @@ def reconcile_board_merges(
|
|
|
2995
3037
|
the daemon's 30s tick (97% of a pass's ``gh`` calls). Set
|
|
2996
3038
|
*throttle_false_merge_audit* to run that sweep at most hourly; the
|
|
2997
3039
|
daemon tick does, a manual ``coord reconcile-merges`` deliberately does
|
|
2998
|
-
not. See the inline block above ``_false_merge_candidates``.
|
|
3040
|
+
not. See the inline block above ``_false_merge_candidates``.
|
|
3041
|
+
|
|
3042
|
+
#2994: *skip_dormant_repos* (also daemon-tick-only, also off for a
|
|
3043
|
+
manual ``coord reconcile-merges``) is threaded through to sweep (c),
|
|
3044
|
+
:func:`close_stale_prs` — see its own docstring — so a repo with no open
|
|
3045
|
+
assignment, no drive-queue entry, and no coord-authored open PR doesn't
|
|
3046
|
+
cost a ``list_open_prs`` call on every tick either.)
|
|
2999
3047
|
"""
|
|
3000
3048
|
from coord import github_ops, state # noqa: PLC0415
|
|
3001
3049
|
|
|
@@ -3139,7 +3187,16 @@ def reconcile_board_merges(
|
|
|
3139
3187
|
state.mark_work_review_settled(a.assignment_id or "")
|
|
3140
3188
|
|
|
3141
3189
|
# (c) #721 — close open PRs whose work has already landed.
|
|
3142
|
-
actions.extend(
|
|
3190
|
+
actions.extend(
|
|
3191
|
+
close_stale_prs(
|
|
3192
|
+
config,
|
|
3193
|
+
board=board,
|
|
3194
|
+
repo=repo,
|
|
3195
|
+
issue=issue,
|
|
3196
|
+
dry_run=dry_run,
|
|
3197
|
+
skip_dormant_repos=skip_dormant_repos,
|
|
3198
|
+
)
|
|
3199
|
+
)
|
|
3143
3200
|
|
|
3144
3201
|
# (d) #732 — prune stale merge_queue entries for closed issues / merged PRs.
|
|
3145
3202
|
# Runs after the board sweeps so a just-marked-merged assignment doesn't
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"""Per-repo dormancy skip for the daemon's periodic GitHub sweeps (#2994).
|
|
2
|
+
|
|
3
|
+
**The problem this closes.** Two of the daemon's slow-cadence ticks —
|
|
4
|
+
``coord.serve_app._sync_issues_tick`` and the stale-PR sweep inside
|
|
5
|
+
``coord.reconcile.close_stale_prs`` (driven by ``_reconcile_merges_tick``) —
|
|
6
|
+
loop over *every registered repo, unconditionally, every tick* and spend a
|
|
7
|
+
``gh`` call (or two) on each. GitHub call volume this way scales with how
|
|
8
|
+
many repos have ever been registered, not with how much work is actually in
|
|
9
|
+
flight: a repo nobody has touched in months costs exactly as much per tick
|
|
10
|
+
as a repo mid-pipeline.
|
|
11
|
+
|
|
12
|
+
**This module's job.** A repo counts as dormant when it has no open
|
|
13
|
+
assignment, no drive-queue entry, and no coord-authored open PR — see
|
|
14
|
+
:func:`repo_has_activity`, computed live from in-memory board state plus a
|
|
15
|
+
local (non-GitHub) drive-queue read, never cached. Because it is live, the
|
|
16
|
+
instant work is queued for a dormant repo the very next tick sees it as
|
|
17
|
+
active again — there is no separate "wake" call to remember to make.
|
|
18
|
+
|
|
19
|
+
A dormant repo is not *permanently* skipped, only skipped until
|
|
20
|
+
:data:`DORMANT_SWEEP_FLOOR_S` has passed since its last real sweep — a
|
|
21
|
+
floor, not a wall — so out-of-band activity (a human-opened PR, an issue
|
|
22
|
+
filed by someone who isn't coord) is still noticed eventually even though
|
|
23
|
+
nothing coord-side would otherwise prompt a look. Same best-effort,
|
|
24
|
+
JSON-backed, never-raises shape as the sibling starvation-floor tracker
|
|
25
|
+
:mod:`coord.issues_sync_status` established for exactly this kind of
|
|
26
|
+
bookkeeping — one file, one dict, no new persistence layer.
|
|
27
|
+
|
|
28
|
+
**Two independent sweep kinds, two independent floors (#2994 review).**
|
|
29
|
+
``_sync_issues_tick`` (issues-sync, ``gh issue list``) and
|
|
30
|
+
``close_stale_prs`` (stale-PR sweep, ``gh pr list``) both call this module
|
|
31
|
+
for the *same repo* in the same daemon tick, one right after the other
|
|
32
|
+
(``_tick_loop``). They are unrelated ``gh`` calls that happen to run
|
|
33
|
+
back-to-back — if they shared one ``{repo_name: last_swept_at}`` clock,
|
|
34
|
+
whichever tick ran first would refresh it before the second ever saw a
|
|
35
|
+
stale-enough value, permanently starving the loser. So every entry point
|
|
36
|
+
takes a mandatory ``kind`` (a short tag like ``"issues"`` or ``"prs"``) and
|
|
37
|
+
the on-disk state is keyed by ``f"{repo_name}:{kind}"`` — same file, two
|
|
38
|
+
disjoint sets of keys, each consumer only ever reads/writes its own.
|
|
39
|
+
|
|
40
|
+
Both consumers follow the same two-call contract:
|
|
41
|
+
|
|
42
|
+
* :func:`should_skip_sweep` before spending the real ``gh`` call — True
|
|
43
|
+
means skip this repo this tick.
|
|
44
|
+
* :func:`record_swept` right after deciding *not* to skip (regardless of
|
|
45
|
+
whether the sweep itself succeeded) — resets the floor timer.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
from __future__ import annotations
|
|
49
|
+
|
|
50
|
+
import json
|
|
51
|
+
import logging
|
|
52
|
+
import os
|
|
53
|
+
import tempfile
|
|
54
|
+
import time
|
|
55
|
+
from pathlib import Path
|
|
56
|
+
from typing import TYPE_CHECKING
|
|
57
|
+
|
|
58
|
+
from coord.platform_paths import default_coord_dir
|
|
59
|
+
|
|
60
|
+
if TYPE_CHECKING:
|
|
61
|
+
from coord.models import Board
|
|
62
|
+
|
|
63
|
+
_log = logging.getLogger(__name__)
|
|
64
|
+
|
|
65
|
+
_STATE_FILENAME = "repo_dormancy_status.json"
|
|
66
|
+
|
|
67
|
+
# How long a genuinely-idle repo may go without a real sweep before the next
|
|
68
|
+
# tick forces one anyway, so out-of-band activity is still noticed within a
|
|
69
|
+
# bounded window rather than never. Comfortably above the default 300s tick
|
|
70
|
+
# cadence (COORD_RECONCILE_MERGES_INTERVAL) so an idle repo actually saves
|
|
71
|
+
# calls on most ticks, short enough that "eventually" reads as "within the
|
|
72
|
+
# hour" to an operator rather than "whenever someone notices."
|
|
73
|
+
DORMANT_SWEEP_FLOOR_S = 3600.0
|
|
74
|
+
|
|
75
|
+
# Sweep-kind tags (#2994 review): each gets its own floor timer, keyed by
|
|
76
|
+
# f"{repo_name}:{kind}" on disk, so the issues-sync tick and the stale-PR
|
|
77
|
+
# sweep never clobber each other's clock even when they run back-to-back
|
|
78
|
+
# for the same repo in the same tick (`_tick_loop`).
|
|
79
|
+
KIND_ISSUES = "issues"
|
|
80
|
+
KIND_PRS = "prs"
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _state_path() -> Path:
|
|
84
|
+
"""Resolve the dormancy state file path.
|
|
85
|
+
|
|
86
|
+
``$COORD_REPO_DORMANCY_STATE`` overrides first — same seam
|
|
87
|
+
``coord.issues_sync_status._state_path`` documents: lets a test redirect
|
|
88
|
+
this with a one-line ``monkeypatch.setenv`` instead of risking a stray
|
|
89
|
+
write into the operator's real ``~/.coord``.
|
|
90
|
+
"""
|
|
91
|
+
override = os.environ.get("COORD_REPO_DORMANCY_STATE")
|
|
92
|
+
if override:
|
|
93
|
+
return Path(override).expanduser()
|
|
94
|
+
return default_coord_dir() / _STATE_FILENAME
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _read_all() -> dict[str, float]:
|
|
98
|
+
path = _state_path()
|
|
99
|
+
try:
|
|
100
|
+
raw = path.read_text(encoding="utf-8")
|
|
101
|
+
except OSError:
|
|
102
|
+
return {}
|
|
103
|
+
try:
|
|
104
|
+
data = json.loads(raw)
|
|
105
|
+
except (json.JSONDecodeError, ValueError):
|
|
106
|
+
return {}
|
|
107
|
+
if not isinstance(data, dict):
|
|
108
|
+
return {}
|
|
109
|
+
return {k: float(v) for k, v in data.items() if isinstance(v, (int, float))}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _write_all(data: dict[str, float]) -> None:
|
|
113
|
+
try:
|
|
114
|
+
path = _state_path()
|
|
115
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
116
|
+
fd, tmp = tempfile.mkstemp(
|
|
117
|
+
prefix=".repo_dormancy.", suffix=".tmp", dir=path.parent
|
|
118
|
+
)
|
|
119
|
+
try:
|
|
120
|
+
with os.fdopen(fd, "w", encoding="utf-8") as fh:
|
|
121
|
+
json.dump(data, fh, sort_keys=True)
|
|
122
|
+
fh.write("\n")
|
|
123
|
+
os.replace(tmp, path)
|
|
124
|
+
except Exception:
|
|
125
|
+
try:
|
|
126
|
+
os.unlink(tmp)
|
|
127
|
+
except OSError:
|
|
128
|
+
pass
|
|
129
|
+
raise
|
|
130
|
+
except Exception as exc: # noqa: BLE001 -- best-effort, never raises
|
|
131
|
+
_log.debug("repo_dormancy: write failed: %s", exc)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _key(repo_name: str, kind: str) -> str:
|
|
135
|
+
return f"{repo_name}:{kind}"
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def record_swept(repo_name: str, kind: str, *, now: float | None = None) -> None:
|
|
139
|
+
"""Best-effort: stamp *repo_name*'s *kind* sweep as having run just now.
|
|
140
|
+
|
|
141
|
+
*kind* is a short tag identifying which independent sweep this is (e.g.
|
|
142
|
+
``"issues"`` for the issues-sync tick, ``"prs"`` for the stale-PR sweep)
|
|
143
|
+
— each gets its own floor timer, keyed by ``f"{repo_name}:{kind}"``, so
|
|
144
|
+
the two sweeps never clobber each other's clock.
|
|
145
|
+
|
|
146
|
+
Called right after a tick decides NOT to skip a repo — regardless of
|
|
147
|
+
whether the sweep itself goes on to succeed or fail — so the floor timer
|
|
148
|
+
reflects "a real gh call was spent on this repo", not "and it worked".
|
|
149
|
+
"""
|
|
150
|
+
now = now if now is not None else time.time()
|
|
151
|
+
data = _read_all()
|
|
152
|
+
data[_key(repo_name, kind)] = now
|
|
153
|
+
_write_all(data)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _last_swept_at(repo_name: str, kind: str) -> float | None:
|
|
157
|
+
return _read_all().get(_key(repo_name, kind))
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def repo_has_activity(repo_name: str, board: Board) -> bool:
|
|
161
|
+
"""True when *repo_name* is NOT idle: an open assignment, a
|
|
162
|
+
coord-authored open PR, or a drive-queue entry.
|
|
163
|
+
|
|
164
|
+
* "Open assignment" — anything in ``board.active`` for this repo
|
|
165
|
+
(pending or running work/review/smoke/conflict-fix sessions).
|
|
166
|
+
* "Coord-authored open PR" — a ``board.completed`` row for this repo
|
|
167
|
+
still sitting at ``status == 'done'`` (landed, PR presumably open,
|
|
168
|
+
not yet flipped to ``'merged'``) — this is tracked locally already
|
|
169
|
+
(it's exactly what the merge-reconcile sweeps exist to resolve), so
|
|
170
|
+
no extra GitHub call is needed to answer this half of the question.
|
|
171
|
+
* "Drive-queue entry" — a local (non-GitHub) DB read via
|
|
172
|
+
:func:`coord.state.list_drive_queue`.
|
|
173
|
+
|
|
174
|
+
Deliberately fails OPEN on a drive-queue read error: a repo we can't
|
|
175
|
+
positively confirm is idle is treated as active, never skipped.
|
|
176
|
+
"""
|
|
177
|
+
for a in board.active:
|
|
178
|
+
if a.repo_name == repo_name:
|
|
179
|
+
return True
|
|
180
|
+
for a in board.completed:
|
|
181
|
+
if a.repo_name == repo_name and a.status == "done":
|
|
182
|
+
return True
|
|
183
|
+
|
|
184
|
+
from coord import state # noqa: PLC0415 -- avoid a state<->reconcile import cycle
|
|
185
|
+
|
|
186
|
+
try:
|
|
187
|
+
if state.list_drive_queue(repo_name):
|
|
188
|
+
return True
|
|
189
|
+
except Exception: # noqa: BLE001 -- best-effort; treat as active on doubt
|
|
190
|
+
return True
|
|
191
|
+
|
|
192
|
+
return False
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def should_skip_sweep(
|
|
196
|
+
repo_name: str, board: Board, kind: str, *, now: float | None = None
|
|
197
|
+
) -> bool:
|
|
198
|
+
"""True when this tick should skip *repo_name*'s *kind* GitHub sweep.
|
|
199
|
+
|
|
200
|
+
*kind* must match the tag the corresponding :func:`record_swept` call
|
|
201
|
+
uses (``"issues"`` vs. ``"prs"``) — the two sweeps are independent
|
|
202
|
+
``gh`` call types with independent floors; see the module docstring for
|
|
203
|
+
why they must not share one clock.
|
|
204
|
+
|
|
205
|
+
Only ever True for a repo with zero activity (see
|
|
206
|
+
:func:`repo_has_activity`) that was also swept for real inside
|
|
207
|
+
:data:`DORMANT_SWEEP_FLOOR_S`. A repo with no recorded sweep at all
|
|
208
|
+
counts as due, not skippable — there is no prior sweep to protect, and a
|
|
209
|
+
freshly-registered repo should get its first real sweep immediately.
|
|
210
|
+
"""
|
|
211
|
+
if repo_has_activity(repo_name, board):
|
|
212
|
+
return False
|
|
213
|
+
last = _last_swept_at(repo_name, kind)
|
|
214
|
+
if last is None:
|
|
215
|
+
return False
|
|
216
|
+
now = now if now is not None else time.time()
|
|
217
|
+
return (now - last) < DORMANT_SWEEP_FLOOR_S
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def clear() -> None:
|
|
221
|
+
"""Drop all recorded sweep timestamps. Best-effort; never raises. Tests only."""
|
|
222
|
+
try:
|
|
223
|
+
_state_path().unlink()
|
|
224
|
+
except OSError:
|
|
225
|
+
pass
|
|
@@ -991,7 +991,13 @@ def _reconcile_merges_tick(config: Config) -> list[str]:
|
|
|
991
991
|
# candidate set proportional to project history — 97% of a reconcile
|
|
992
992
|
# pass's `gh` calls, and the demand behind the fleet-wide secondary rate
|
|
993
993
|
# limiting. A manual `coord reconcile-merges` still sweeps every time.
|
|
994
|
-
|
|
994
|
+
# #2994: same daemon-only opt-in for `skip_dormant_repos` — the stale-PR
|
|
995
|
+
# sweep (close_stale_prs, sweep c) otherwise lists open PRs for every
|
|
996
|
+
# registered repo every tick regardless of activity. A manual
|
|
997
|
+
# `coord reconcile-merges` still sweeps every repo.
|
|
998
|
+
actions = reconcile_board_merges(
|
|
999
|
+
board, config, throttle_false_merge_audit=True, skip_dormant_repos=True
|
|
1000
|
+
)
|
|
995
1001
|
save_board(board)
|
|
996
1002
|
if actions:
|
|
997
1003
|
# #1038: one coarse operational row per tick that did something —
|
|
@@ -1035,11 +1041,24 @@ def _sync_issues_tick(config: Config) -> int:
|
|
|
1035
1041
|
sample for 39 minutes straight, even though a direct ``gh`` call
|
|
1036
1042
|
succeeded in under a second the whole time. See
|
|
1037
1043
|
``coord.github_ops._gh``'s docstring for exactly what the flag changes.
|
|
1044
|
+
|
|
1045
|
+
#2994: before spending a call on a repo, consult
|
|
1046
|
+
``coord.repo_dormancy.should_skip_sweep`` — a repo with no open
|
|
1047
|
+
assignment, no drive-queue entry, and no coord-authored open PR is
|
|
1048
|
+
dormant, and dormant repos are only swept once per
|
|
1049
|
+
``coord.repo_dormancy.DORMANT_SWEEP_FLOOR_S`` rather than every tick.
|
|
1050
|
+
Queuing work for a dormant repo un-skips it on the very next tick (the
|
|
1051
|
+
check is live against board + drive-queue state, never cached). This
|
|
1052
|
+
adds a ``build_board()`` call to this tick that wasn't here before —
|
|
1053
|
+
a local SQLite read, not a network call; every other slow-cadence tick
|
|
1054
|
+
in this module (``_reconcile_merges_tick`` included, run moments earlier
|
|
1055
|
+
in the same ``_tick_loop`` pass) already pays it once per tick, so this
|
|
1056
|
+
is not new cost territory.
|
|
1038
1057
|
"""
|
|
1039
1058
|
import logging # noqa: PLC0415
|
|
1040
1059
|
|
|
1041
|
-
from coord import github_ops, issues_sync_status # noqa: PLC0415
|
|
1042
|
-
from coord.state import _upsert_open_issues_local # noqa: PLC0415
|
|
1060
|
+
from coord import github_ops, issues_sync_status, repo_dormancy # noqa: PLC0415
|
|
1061
|
+
from coord.state import _upsert_open_issues_local, build_board # noqa: PLC0415
|
|
1043
1062
|
|
|
1044
1063
|
# Use the private _upsert_open_issues_local (underscore-prefixed) rather
|
|
1045
1064
|
# than the public upsert_open_issues, because the public variant routes
|
|
@@ -1047,8 +1066,16 @@ def _sync_issues_tick(config: Config) -> int:
|
|
|
1047
1066
|
# configured. Since this function IS the daemon, we must write directly
|
|
1048
1067
|
# to the local DB to avoid a self-referential HTTP call.
|
|
1049
1068
|
log = logging.getLogger("coord.serve")
|
|
1069
|
+
board = build_board()
|
|
1050
1070
|
total = 0
|
|
1071
|
+
skipped_dormant = 0
|
|
1051
1072
|
for repo in config.repos:
|
|
1073
|
+
if repo_dormancy.should_skip_sweep(
|
|
1074
|
+
repo.name, board, repo_dormancy.KIND_ISSUES
|
|
1075
|
+
):
|
|
1076
|
+
skipped_dormant += 1
|
|
1077
|
+
continue
|
|
1078
|
+
repo_dormancy.record_swept(repo.name, repo_dormancy.KIND_ISSUES)
|
|
1052
1079
|
starved = issues_sync_status.is_starved(repo.name)
|
|
1053
1080
|
issues_sync_status.record_attempt(repo.name)
|
|
1054
1081
|
try:
|
|
@@ -1065,7 +1092,16 @@ def _sync_issues_tick(config: Config) -> int:
|
|
|
1065
1092
|
" (starvation-floor bypass already attempted)" if starved else "",
|
|
1066
1093
|
exc_info=True,
|
|
1067
1094
|
)
|
|
1068
|
-
|
|
1095
|
+
if skipped_dormant:
|
|
1096
|
+
log.info(
|
|
1097
|
+
"issues-sync tick: skipped %d dormant repo(s) (no open assignment, "
|
|
1098
|
+
"drive-queue entry, or open PR)",
|
|
1099
|
+
skipped_dormant,
|
|
1100
|
+
)
|
|
1101
|
+
log.debug(
|
|
1102
|
+
"issues-sync tick: %d open issues across %d repos (%d dormant-skipped)",
|
|
1103
|
+
total, len(config.repos), skipped_dormant,
|
|
1104
|
+
)
|
|
1069
1105
|
return total
|
|
1070
1106
|
|
|
1071
1107
|
|
|
@@ -761,6 +761,29 @@ def _no_real_issues_sync_status_store(monkeypatch, tmp_path):
|
|
|
761
761
|
)
|
|
762
762
|
|
|
763
763
|
|
|
764
|
+
@pytest.fixture(autouse=True)
|
|
765
|
+
def _no_real_repo_dormancy_store(monkeypatch, tmp_path):
|
|
766
|
+
"""#2994: never let a test write the OPERATOR'S real
|
|
767
|
+
``~/.coord/repo_dormancy_status.json``.
|
|
768
|
+
|
|
769
|
+
Same hazard as ``_no_real_issues_sync_status_store`` immediately above,
|
|
770
|
+
one file over: this one is the per-repo dormant-sweep floor timer
|
|
771
|
+
(``coord.repo_dormancy``) that both ``coord.serve_app._sync_issues_tick``
|
|
772
|
+
and ``coord.reconcile.close_stale_prs`` consult before spending a real
|
|
773
|
+
``gh`` call on a repo. A leaked test write could plant a fake recent
|
|
774
|
+
sweep timestamp that spuriously skips a real fleet's dormant repo past
|
|
775
|
+
its floor, or clear one and force an extra sweep early.
|
|
776
|
+
|
|
777
|
+
``coord.repo_dormancy._state_path`` reads
|
|
778
|
+
``$COORD_REPO_DORMANCY_STATE`` first for exactly this redirect, the same
|
|
779
|
+
env-var seam ``_no_real_issues_sync_status_store`` uses, not a
|
|
780
|
+
monkeypatched private function.
|
|
781
|
+
"""
|
|
782
|
+
monkeypatch.setenv(
|
|
783
|
+
"COORD_REPO_DORMANCY_STATE", str(tmp_path / "repo-dormancy-status.json")
|
|
784
|
+
)
|
|
785
|
+
|
|
786
|
+
|
|
764
787
|
@pytest.fixture(autouse=True)
|
|
765
788
|
def _no_real_roll_pending_store(monkeypatch, tmp_path):
|
|
766
789
|
"""#2587: never let a test write the OPERATOR'S real
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import time
|
|
6
|
+
|
|
5
7
|
import pytest
|
|
6
8
|
|
|
7
9
|
from coord import github_ops
|
|
@@ -907,6 +909,141 @@ def test_stale_pr_sweep_integrated_into_reconcile_board_merges(
|
|
|
907
909
|
assert any("close PR #44" in s for s in actions)
|
|
908
910
|
|
|
909
911
|
|
|
912
|
+
# ── #2994: dormant-repo skip ──────────────────────────────────────────────────
|
|
913
|
+
|
|
914
|
+
|
|
915
|
+
@pytest.fixture
|
|
916
|
+
def two_repo_config() -> Config:
|
|
917
|
+
return Config(
|
|
918
|
+
repos=[
|
|
919
|
+
Repo(name="api", github="acme/api", default_branch="main"),
|
|
920
|
+
Repo(name="idle", github="acme/idle", default_branch="main"),
|
|
921
|
+
],
|
|
922
|
+
machines=[],
|
|
923
|
+
)
|
|
924
|
+
|
|
925
|
+
|
|
926
|
+
def test_close_stale_prs_skips_dormant_repo_when_opted_in(
|
|
927
|
+
monkeypatch, two_repo_config
|
|
928
|
+
) -> None:
|
|
929
|
+
"""#2994: with skip_dormant_repos=True and a board showing activity on
|
|
930
|
+
'api' but nothing at all on 'idle', the sweep must not call
|
|
931
|
+
list_open_prs for 'idle' -- and must say so in its actions."""
|
|
932
|
+
from coord import repo_dormancy
|
|
933
|
+
|
|
934
|
+
calls: list[str] = []
|
|
935
|
+
monkeypatch.setattr(
|
|
936
|
+
github_ops,
|
|
937
|
+
"list_open_prs",
|
|
938
|
+
lambda repo: calls.append(repo) or [],
|
|
939
|
+
)
|
|
940
|
+
|
|
941
|
+
# 'idle' already had a baseline sweep, well inside the floor -- only a
|
|
942
|
+
# repo that has been swept before is even eligible to be skipped (see
|
|
943
|
+
# test_never_swept_repo_is_not_skipped in test_repo_dormancy.py).
|
|
944
|
+
repo_dormancy.record_swept("idle", repo_dormancy.KIND_PRS, now=time.time())
|
|
945
|
+
|
|
946
|
+
board = Board(
|
|
947
|
+
active=[],
|
|
948
|
+
completed=[_done_work(assignment_id="w1", branch="issue-1-x")],
|
|
949
|
+
)
|
|
950
|
+
board.completed[0].repo_name = "api"
|
|
951
|
+
|
|
952
|
+
actions = close_stale_prs(two_repo_config, board=board, skip_dormant_repos=True)
|
|
953
|
+
|
|
954
|
+
assert calls == ["acme/api"]
|
|
955
|
+
assert any("skipped 1 dormant repo" in s for s in actions)
|
|
956
|
+
|
|
957
|
+
|
|
958
|
+
def test_close_stale_prs_default_does_not_skip_idle_repo(
|
|
959
|
+
monkeypatch, two_repo_config
|
|
960
|
+
) -> None:
|
|
961
|
+
"""Without opting in (the manual `coord reconcile-merges` path), every
|
|
962
|
+
repo is still swept even when a board is supplied and shows no
|
|
963
|
+
activity anywhere -- skip_dormant_repos defaults to False."""
|
|
964
|
+
calls: list[str] = []
|
|
965
|
+
monkeypatch.setattr(
|
|
966
|
+
github_ops,
|
|
967
|
+
"list_open_prs",
|
|
968
|
+
lambda repo: calls.append(repo) or [],
|
|
969
|
+
)
|
|
970
|
+
|
|
971
|
+
board = Board(active=[], completed=[])
|
|
972
|
+
|
|
973
|
+
actions = close_stale_prs(two_repo_config, board=board)
|
|
974
|
+
|
|
975
|
+
assert calls == ["acme/api", "acme/idle"]
|
|
976
|
+
assert not any("dormant" in s for s in actions)
|
|
977
|
+
|
|
978
|
+
|
|
979
|
+
def test_close_stale_prs_dormant_repo_swept_again_past_the_floor(
|
|
980
|
+
monkeypatch, config
|
|
981
|
+
) -> None:
|
|
982
|
+
"""A dormant repo is only skipped inside DORMANT_SWEEP_FLOOR_S of its
|
|
983
|
+
last real sweep -- past that, the next tick sweeps it for real again so
|
|
984
|
+
out-of-band activity is still noticed eventually."""
|
|
985
|
+
from coord import repo_dormancy
|
|
986
|
+
|
|
987
|
+
calls: list[str] = []
|
|
988
|
+
monkeypatch.setattr(
|
|
989
|
+
github_ops,
|
|
990
|
+
"list_open_prs",
|
|
991
|
+
lambda repo: calls.append(repo) or [],
|
|
992
|
+
)
|
|
993
|
+
|
|
994
|
+
now = time.time()
|
|
995
|
+
repo_dormancy.record_swept(
|
|
996
|
+
"api", repo_dormancy.KIND_PRS, now=now - repo_dormancy.DORMANT_SWEEP_FLOOR_S - 1.0
|
|
997
|
+
)
|
|
998
|
+
|
|
999
|
+
board = Board(active=[], completed=[]) # no activity -- 'api' is idle
|
|
1000
|
+
|
|
1001
|
+
actions = close_stale_prs(config, board=board, skip_dormant_repos=True)
|
|
1002
|
+
|
|
1003
|
+
assert calls == ["acme/api"]
|
|
1004
|
+
assert not any("dormant" in s for s in actions)
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
def test_reconcile_board_merges_wakes_dormant_repo_when_work_is_queued(
|
|
1008
|
+
monkeypatch, two_repo_config
|
|
1009
|
+
) -> None:
|
|
1010
|
+
"""#2994 acceptance: queuing work for a dormant repo puts it back on the
|
|
1011
|
+
normal cadence on the very next tick, not after the floor expires."""
|
|
1012
|
+
from coord import repo_dormancy
|
|
1013
|
+
|
|
1014
|
+
_patch_probes(monkeypatch, remote_branches=set(), terminal=False)
|
|
1015
|
+
calls: list[str] = []
|
|
1016
|
+
monkeypatch.setattr(
|
|
1017
|
+
github_ops,
|
|
1018
|
+
"list_open_prs",
|
|
1019
|
+
lambda repo: calls.append(repo) or [],
|
|
1020
|
+
)
|
|
1021
|
+
|
|
1022
|
+
now = time.time()
|
|
1023
|
+
# Both repos need a baseline sweep before dormancy skip applies at all
|
|
1024
|
+
# ('never swept' always sweeps -- see test_never_swept_repo_is_not_skipped
|
|
1025
|
+
# in test_repo_dormancy.py). 'api' has real activity below so it's never
|
|
1026
|
+
# skipped regardless; 'idle' was just swept -- well inside the floor.
|
|
1027
|
+
repo_dormancy.record_swept("api", repo_dormancy.KIND_PRS, now=now)
|
|
1028
|
+
repo_dormancy.record_swept("idle", repo_dormancy.KIND_PRS, now=now)
|
|
1029
|
+
|
|
1030
|
+
api_assignment = _done_work(assignment_id="w-api", status="running")
|
|
1031
|
+
api_assignment.repo_name = "api"
|
|
1032
|
+
board = Board(active=[api_assignment], completed=[])
|
|
1033
|
+
reconcile_board_merges(board, two_repo_config, skip_dormant_repos=True)
|
|
1034
|
+
assert calls == ["acme/api"] # 'idle' skipped -- still inside the floor
|
|
1035
|
+
|
|
1036
|
+
# Work gets queued for 'idle' (an open assignment appears on the board).
|
|
1037
|
+
calls.clear()
|
|
1038
|
+
idle_assignment = _done_work(assignment_id="w-idle", status="pending")
|
|
1039
|
+
idle_assignment.repo_name = "idle"
|
|
1040
|
+
board.active.append(idle_assignment)
|
|
1041
|
+
|
|
1042
|
+
reconcile_board_merges(board, two_repo_config, skip_dormant_repos=True)
|
|
1043
|
+
|
|
1044
|
+
assert calls == ["acme/api", "acme/idle"]
|
|
1045
|
+
|
|
1046
|
+
|
|
910
1047
|
# ── #732 prune stale merge_queue entries ─────────────────────────────────────
|
|
911
1048
|
|
|
912
1049
|
|