code-coordinator 0.5.315__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.315 → code_coordinator-0.5.317}/PKG-INFO +1 -1
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/scm_file_list.json +2 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/github_ops.py +24 -2
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/reconcile.py +208 -17
- code_coordinator-0.5.317/coord/repo_dormancy.py +225 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/serve_app.py +45 -4
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/state.py +135 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/conftest.py +23 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_merges.py +490 -4
- code_coordinator-0.5.317/tests/test_repo_dormancy.py +187 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_serve.py +139 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.gitignore +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/CLAUDE.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/GOAL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/LICENSE +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/MANIFEST.in +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/README.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/__init__.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agent.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/audit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/block_log.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/board_service.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/brain.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/claim.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/cli.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/client.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/comments.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/config.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dao.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/db.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deps.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/drive.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/events.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/filelock.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/freshness.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/gates.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/goal.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/context.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/models.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/render.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/units.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/hooks.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/interactive.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/models.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/network.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notify.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/openapi.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/parentage.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/plans.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/progress.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/release_window.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/reports.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/review.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/self_health.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/smoke.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/split_work.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/sql.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/test_author.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/test_report.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/usage.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/install-agent.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/pyproject.toml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/setup.cfg +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/__init__.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/backends.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_db.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_events.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_init.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_models.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_network.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_session.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_split.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_state.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.315 → 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.315 → 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",
|
|
@@ -1892,7 +1892,9 @@ def list_remote_branch_names(repo: str) -> set[str]:
|
|
|
1892
1892
|
}
|
|
1893
1893
|
|
|
1894
1894
|
|
|
1895
|
-
def branch_exists_on_remote(
|
|
1895
|
+
def branch_exists_on_remote(
|
|
1896
|
+
repo: str, branch: str, *, cache: dict | None = None
|
|
1897
|
+
) -> bool:
|
|
1896
1898
|
"""Return True if `branch` currently exists on `repo` (owner/name) at GitHub.
|
|
1897
1899
|
|
|
1898
1900
|
Uses a targeted ``gh api`` call rather than listing all branches. Fails
|
|
@@ -1903,7 +1905,27 @@ def branch_exists_on_remote(repo: str, branch: str) -> bool:
|
|
|
1903
1905
|
|
|
1904
1906
|
Called by ``dispatch_review`` and ``_dispatch_fix`` (#586) to avoid
|
|
1905
1907
|
routing a follow-on assignment to a machine that can't fetch the branch.
|
|
1906
|
-
|
|
1908
|
+
|
|
1909
|
+
*cache* (#2989) is an optional caller-owned ``dict`` used to memoise the
|
|
1910
|
+
lookup for the duration of ONE sweep, mirroring
|
|
1911
|
+
:func:`work_is_terminal`'s ``cache=``. A single ``reconcile_board_merges``
|
|
1912
|
+
pass measured 1,304 ref lookups for only 851 distinct refs (1.53x
|
|
1913
|
+
redundancy) because sibling assignment rows — a work row and its
|
|
1914
|
+
conflict-fix, or a re-dispatch — legitimately share one branch. The
|
|
1915
|
+
cache is deliberately **per-pass and caller-scoped**, never module-level:
|
|
1916
|
+
branch existence is exactly the kind of fact that must be re-read on the
|
|
1917
|
+
next pass.
|
|
1918
|
+
"""
|
|
1919
|
+
key = (repo, branch)
|
|
1920
|
+
if cache is not None and key in cache:
|
|
1921
|
+
return cache[key]
|
|
1922
|
+
result = _branch_exists_on_remote_uncached(repo, branch)
|
|
1923
|
+
if cache is not None:
|
|
1924
|
+
cache[key] = result
|
|
1925
|
+
return result
|
|
1926
|
+
|
|
1927
|
+
|
|
1928
|
+
def _branch_exists_on_remote_uncached(repo: str, branch: str) -> bool:
|
|
1907
1929
|
try:
|
|
1908
1930
|
_gh("api", f"repos/{repo}/git/refs/heads/{branch}",
|
|
1909
1931
|
caller="github_ops.branch_exists_on_remote")
|
|
@@ -31,6 +31,23 @@ if TYPE_CHECKING:
|
|
|
31
31
|
# and treating a huge, all-matching-so-far diff as inconclusive (fail open).
|
|
32
32
|
_FALSE_MERGE_AUDIT_MAX_FILES = 20
|
|
33
33
|
|
|
34
|
+
# #2989: bounds the OUTER candidate set of that same sweep — the loop #2639
|
|
35
|
+
# left unbounded. Without it the set is proportional to project history
|
|
36
|
+
# (1,302 rows on the drive host, +1 per merge, never shrinking), re-probed
|
|
37
|
+
# every 30s. This is a per-pass ceiling applied newest-first as a backstop
|
|
38
|
+
# behind the persistent terminal marker (`state.mark_false_merge_audit_
|
|
39
|
+
# clean`); the older tail drains over subsequent passes as newer rows are
|
|
40
|
+
# confirmed and drop out permanently. Not applied to a targeted
|
|
41
|
+
# `--issue N` audit.
|
|
42
|
+
_FALSE_MERGE_AUDIT_MAX_ROWS = 50
|
|
43
|
+
|
|
44
|
+
# #2989: how often the sweep may run when the caller opts into throttling
|
|
45
|
+
# (the daemon's reconcile tick does; a manual `coord reconcile-merges` does
|
|
46
|
+
# not). It detects a rare, non-urgent condition — a merged-marked row whose
|
|
47
|
+
# branch still differs from base — which is an hourly sweep, not a
|
|
48
|
+
# twice-a-minute one.
|
|
49
|
+
_FALSE_MERGE_AUDIT_MIN_INTERVAL_SECONDS = 3600.0
|
|
50
|
+
|
|
34
51
|
|
|
35
52
|
def _query_agent(host: str, port: int = AGENT_PORT, timeout: float = 5.0) -> dict | None:
|
|
36
53
|
try:
|
|
@@ -2774,9 +2791,11 @@ def _extract_issue_number(branch: str) -> int | None:
|
|
|
2774
2791
|
def close_stale_prs(
|
|
2775
2792
|
config: Config,
|
|
2776
2793
|
*,
|
|
2794
|
+
board: Board | None = None,
|
|
2777
2795
|
repo: str | None = None,
|
|
2778
2796
|
issue: int | None = None,
|
|
2779
2797
|
dry_run: bool = False,
|
|
2798
|
+
skip_dormant_repos: bool = False,
|
|
2780
2799
|
) -> list[str]:
|
|
2781
2800
|
"""Close open PRs whose work is already on main or whose issue is closed.
|
|
2782
2801
|
|
|
@@ -2791,15 +2810,46 @@ def close_stale_prs(
|
|
|
2791
2810
|
|
|
2792
2811
|
Stale PRs are closed with an explanatory comment. Non-stale PRs are left
|
|
2793
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.
|
|
2794
2833
|
"""
|
|
2795
2834
|
from coord import github_ops # noqa: PLC0415
|
|
2796
2835
|
|
|
2797
2836
|
actions: list[str] = []
|
|
2837
|
+
dormant_skipped = 0
|
|
2798
2838
|
|
|
2799
2839
|
for repo_cfg in config.repos:
|
|
2800
2840
|
if repo is not None and repo_cfg.name != repo:
|
|
2801
2841
|
continue
|
|
2802
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
|
+
|
|
2803
2853
|
try:
|
|
2804
2854
|
open_prs = github_ops.list_open_prs(repo_cfg.github)
|
|
2805
2855
|
except Exception as exc: # noqa: BLE001
|
|
@@ -2874,6 +2924,14 @@ def close_stale_prs(
|
|
|
2874
2924
|
except Exception as exc: # noqa: BLE001
|
|
2875
2925
|
actions.append(f" ↳ error closing PR #{pr_number}: {exc}")
|
|
2876
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
|
+
|
|
2877
2935
|
return actions
|
|
2878
2936
|
|
|
2879
2937
|
|
|
@@ -2908,6 +2966,8 @@ def reconcile_board_merges(
|
|
|
2908
2966
|
repo: str | None = None,
|
|
2909
2967
|
issue: int | None = None,
|
|
2910
2968
|
dry_run: bool = False,
|
|
2969
|
+
throttle_false_merge_audit: bool = False,
|
|
2970
|
+
skip_dormant_repos: bool = False,
|
|
2911
2971
|
) -> list[str]:
|
|
2912
2972
|
"""Reconcile done work assignments against git/GitHub reality.
|
|
2913
2973
|
|
|
@@ -2970,7 +3030,20 @@ def reconcile_board_merges(
|
|
|
2970
3030
|
catching a historical false ``status='merged'`` flip that predates this
|
|
2971
3031
|
fix (or any future bug shaped like it) rather than leaving it invisible
|
|
2972
3032
|
to every other diagnostic forever. See its own inline comment for the
|
|
2973
|
-
full methodology and false-positive guards.
|
|
3033
|
+
full methodology and false-positive guards.
|
|
3034
|
+
|
|
3035
|
+
#2989 bounds sweep (h)'s candidate set — it used to select every
|
|
3036
|
+
``merged`` work-like row in project history and re-probe all of them on
|
|
3037
|
+
the daemon's 30s tick (97% of a pass's ``gh`` calls). Set
|
|
3038
|
+
*throttle_false_merge_audit* to run that sweep at most hourly; the
|
|
3039
|
+
daemon tick does, a manual ``coord reconcile-merges`` deliberately does
|
|
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.)
|
|
2974
3047
|
"""
|
|
2975
3048
|
from coord import github_ops, state # noqa: PLC0415
|
|
2976
3049
|
|
|
@@ -3114,7 +3187,16 @@ def reconcile_board_merges(
|
|
|
3114
3187
|
state.mark_work_review_settled(a.assignment_id or "")
|
|
3115
3188
|
|
|
3116
3189
|
# (c) #721 — close open PRs whose work has already landed.
|
|
3117
|
-
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
|
+
)
|
|
3118
3200
|
|
|
3119
3201
|
# (d) #732 — prune stale merge_queue entries for closed issues / merged PRs.
|
|
3120
3202
|
# Runs after the board sweeps so a just-marked-merged assignment doesn't
|
|
@@ -3456,28 +3538,121 @@ def reconcile_board_merges(
|
|
|
3456
3538
|
# this is a FLAG for a human to check, exactly like the manual sweep this
|
|
3457
3539
|
# automates, not a verdict. Fail-open at every layer: any fetch failure
|
|
3458
3540
|
# skips that row/file rather than either flagging or clearing it.
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
3466
|
-
|
|
3467
|
-
|
|
3541
|
+
#
|
|
3542
|
+
# BOUNDING (#2989) — three mechanisms, applied in this order. Before
|
|
3543
|
+
# them this sweep selected EVERY `merged` work-like row in the board:
|
|
3544
|
+
# 1,302 rows on the drive host, proportional to project history rather
|
|
3545
|
+
# than to work in flight, re-probed on the daemon's 30s tick. Measured,
|
|
3546
|
+
# that was 1,304 of one pass's 1,346 `gh` invocations (97%), and the
|
|
3547
|
+
# generator behind the fleet-wide secondary rate limiting #2809/#2858/
|
|
3548
|
+
# #2934/#2977 all treated symptomatically. (#2639 had already capped
|
|
3549
|
+
# the inner per-file loop — the wrong loop; the outer candidate set was
|
|
3550
|
+
# left unbounded.)
|
|
3551
|
+
#
|
|
3552
|
+
# (1) CADENCE. This detects a rare, non-urgent condition — a
|
|
3553
|
+
# merged-marked row whose branch still differs from base, which is
|
|
3554
|
+
# recovered by a human days later regardless. Twice a minute is
|
|
3555
|
+
# absurd for that. The daemon tick passes
|
|
3556
|
+
# `throttle_false_merge_audit=True` and the sweep then runs at most
|
|
3557
|
+
# once an hour (~120x fewer passes on its own). A manual `coord
|
|
3558
|
+
# reconcile-merges` / `coord diagnose` never throttles: an operator
|
|
3559
|
+
# who asked for a sweep gets one, deterministically.
|
|
3560
|
+
# (2) TERMINAL MARKER. A clean verdict is clean forever (branch
|
|
3561
|
+
# deleted, merged PR at the tip, already an ancestor of base, or
|
|
3562
|
+
# content byte-identical on base — none of those un-happen for a
|
|
3563
|
+
# terminal row). Persisting it (`state.mark_false_merge_audit_
|
|
3564
|
+
# clean`) drops the row from the candidate list permanently, which
|
|
3565
|
+
# makes the set proportional to *unaudited* merges — bounded by
|
|
3566
|
+
# recent throughput, not project age. This is the real fix, and
|
|
3567
|
+
# the same discipline `coord.gate_snapshot`'s refresh already
|
|
3568
|
+
# states ("merged history is never refreshed").
|
|
3569
|
+
# (3) RECENCY CAP. A backstop for the first pass after this ships (and
|
|
3570
|
+
# for any board whose marker was lost): audit at most
|
|
3571
|
+
# `_FALSE_MERGE_AUDIT_MAX_ROWS` rows per pass, newest first. A
|
|
3572
|
+
# false merge that has gone unnoticed for two months is not being
|
|
3573
|
+
# caught by a 30-second sweep anyway; the older tail is simply
|
|
3574
|
+
# drained over the following passes as newer rows get marked.
|
|
3575
|
+
#
|
|
3576
|
+
# An explicit `--issue N` bypasses (2) and (3) entirely: a targeted
|
|
3577
|
+
# re-audit must always re-probe, so a previously-cleared row stays
|
|
3578
|
+
# re-checkable by hand. Nothing here changes what the sweep CONCLUDES,
|
|
3579
|
+
# only how many probes it takes to conclude it.
|
|
3580
|
+
_false_merge_targeted = issue is not None
|
|
3581
|
+
_run_false_merge_audit = True
|
|
3582
|
+
if throttle_false_merge_audit and not _false_merge_targeted:
|
|
3583
|
+
_last_run = state.get_false_merge_audit_last_run()
|
|
3584
|
+
if (time.time() - _last_run) < _FALSE_MERGE_AUDIT_MIN_INTERVAL_SECONDS:
|
|
3585
|
+
_run_false_merge_audit = False
|
|
3586
|
+
|
|
3587
|
+
_false_merge_candidates: list[Assignment] = []
|
|
3588
|
+
if _run_false_merge_audit:
|
|
3589
|
+
_false_merge_candidates = [
|
|
3590
|
+
a
|
|
3591
|
+
for a in board.active + board.completed
|
|
3592
|
+
if a.status == "merged"
|
|
3593
|
+
and a.branch
|
|
3594
|
+
and (a.type in WORK_LIKE_TYPES or is_interactive_merge_session(a))
|
|
3595
|
+
and (repo is None or a.repo_name == repo)
|
|
3596
|
+
and (issue is None or a.issue_number == issue)
|
|
3597
|
+
# #2989: a row whose repo has no GitHub mapping is unprobeable —
|
|
3598
|
+
# drop it HERE rather than after the recency cap, so a pile of
|
|
3599
|
+
# orphaned rows (a repo since removed from coordinator.yml) can't
|
|
3600
|
+
# eat the cap's slots and starve the rows we can actually audit.
|
|
3601
|
+
and getattr(config.repo(a.repo_name), "github", None)
|
|
3602
|
+
]
|
|
3603
|
+
if not _false_merge_targeted:
|
|
3604
|
+
_already_clean = state.load_false_merge_audit_clean()
|
|
3605
|
+
if _already_clean:
|
|
3606
|
+
_false_merge_candidates = [
|
|
3607
|
+
a
|
|
3608
|
+
for a in _false_merge_candidates
|
|
3609
|
+
if a.assignment_id not in _already_clean
|
|
3610
|
+
]
|
|
3611
|
+
if len(_false_merge_candidates) > _FALSE_MERGE_AUDIT_MAX_ROWS:
|
|
3612
|
+
_false_merge_candidates.sort(
|
|
3613
|
+
key=lambda a: (a.finished_at or a.dispatched_at or 0.0),
|
|
3614
|
+
reverse=True,
|
|
3615
|
+
)
|
|
3616
|
+
_false_merge_candidates = _false_merge_candidates[
|
|
3617
|
+
:_FALSE_MERGE_AUDIT_MAX_ROWS
|
|
3618
|
+
]
|
|
3619
|
+
|
|
3620
|
+
if (
|
|
3621
|
+
_run_false_merge_audit
|
|
3622
|
+
and throttle_false_merge_audit
|
|
3623
|
+
and not _false_merge_targeted
|
|
3624
|
+
and not dry_run # a dry-run must not consume the real run's turn
|
|
3625
|
+
):
|
|
3626
|
+
# Stamp even when there was nothing to do — the point of the stamp is
|
|
3627
|
+
# "this sweep had its turn this hour", not "this sweep found work".
|
|
3628
|
+
state.set_false_merge_audit_last_run(time.time())
|
|
3629
|
+
|
|
3468
3630
|
if _false_merge_candidates:
|
|
3469
3631
|
from coord.branch_model import resolve_base_branch_for_issue_number # noqa: PLC0415
|
|
3470
3632
|
|
|
3471
3633
|
_false_merge_milestone_cache: dict = {}
|
|
3634
|
+
# #2989 mechanism (3'): one ref lookup per DISTINCT (repo, branch)
|
|
3635
|
+
# per pass, not one per row. Sibling rows legitimately share a
|
|
3636
|
+
# branch (a work row and its conflict-fix, a re-dispatch), which
|
|
3637
|
+
# measured 1.53x redundancy — ~453 wasted calls in a single pass.
|
|
3638
|
+
_false_merge_branch_cache: dict = {}
|
|
3639
|
+
_false_merge_confirmed_clean: list[str] = []
|
|
3472
3640
|
for a in _false_merge_candidates:
|
|
3473
3641
|
repo_cfg = config.repo(a.repo_name)
|
|
3474
3642
|
if repo_cfg is None or not repo_cfg.github:
|
|
3475
3643
|
continue
|
|
3476
3644
|
try:
|
|
3477
|
-
if not github_ops.branch_exists_on_remote(
|
|
3478
|
-
|
|
3645
|
+
if not github_ops.branch_exists_on_remote(
|
|
3646
|
+
repo_cfg.github, a.branch, cache=_false_merge_branch_cache
|
|
3647
|
+
):
|
|
3648
|
+
# branch gone — presumed genuinely merged + cleaned up,
|
|
3649
|
+
# and permanently so (#2989).
|
|
3650
|
+
_false_merge_confirmed_clean.append(a.assignment_id)
|
|
3651
|
+
continue
|
|
3479
3652
|
if github_ops.pr_is_merged(repo_cfg.github, a.branch):
|
|
3480
|
-
|
|
3653
|
+
# correctly tracked: a merged PR sits at this exact tip
|
|
3654
|
+
_false_merge_confirmed_clean.append(a.assignment_id)
|
|
3655
|
+
continue
|
|
3481
3656
|
base_branch = resolve_base_branch_for_issue_number(
|
|
3482
3657
|
repo_cfg,
|
|
3483
3658
|
repo_cfg.github,
|
|
@@ -3487,13 +3662,20 @@ def reconcile_board_merges(
|
|
|
3487
3662
|
ahead = github_ops.branch_commits_ahead(
|
|
3488
3663
|
repo_cfg.github, base_branch, a.branch
|
|
3489
3664
|
)
|
|
3490
|
-
if
|
|
3665
|
+
if ahead is None:
|
|
3666
|
+
# fail-open: the probe itself failed, so this row is NOT
|
|
3667
|
+
# confirmed clean — re-probe it next pass (#2989).
|
|
3668
|
+
continue
|
|
3669
|
+
if ahead == 0:
|
|
3670
|
+
# already an ancestor of base: its content landed, and
|
|
3671
|
+
# that is permanent (#2989).
|
|
3672
|
+
_false_merge_confirmed_clean.append(a.assignment_id)
|
|
3491
3673
|
continue
|
|
3492
3674
|
changed_files = github_ops.get_compare_files(
|
|
3493
3675
|
repo_cfg.github, base_branch, a.branch
|
|
3494
3676
|
)
|
|
3495
3677
|
if not changed_files:
|
|
3496
|
-
continue # can't confirm anything — fail open
|
|
3678
|
+
continue # can't confirm anything — fail open, re-probe
|
|
3497
3679
|
content_differs = False
|
|
3498
3680
|
differing_path = None
|
|
3499
3681
|
for _path in changed_files[:_FALSE_MERGE_AUDIT_MAX_FILES]:
|
|
@@ -3514,7 +3696,10 @@ def reconcile_board_merges(
|
|
|
3514
3696
|
differing_path = _path
|
|
3515
3697
|
break
|
|
3516
3698
|
if not content_differs:
|
|
3517
|
-
|
|
3699
|
+
# verbatim on base already — rebase/squash, not lost, and
|
|
3700
|
+
# a terminal row's content cannot un-land (#2989).
|
|
3701
|
+
_false_merge_confirmed_clean.append(a.assignment_id)
|
|
3702
|
+
continue
|
|
3518
3703
|
actions.append(
|
|
3519
3704
|
f"POSSIBLY LOST (#2639): {a.assignment_id} "
|
|
3520
3705
|
f"({a.repo_name} #{a.issue_number}, branch={a.branch}) is "
|
|
@@ -3535,4 +3720,10 @@ def reconcile_board_merges(
|
|
|
3535
3720
|
f"({a.repo_name} #{a.issue_number}): {exc}"
|
|
3536
3721
|
)
|
|
3537
3722
|
|
|
3723
|
+
# #2989: persist the terminal marker once, at the end of the sweep —
|
|
3724
|
+
# one board_meta write per pass, not one per row. Never on a
|
|
3725
|
+
# dry-run: `--dry-run` must not change what the next real pass does.
|
|
3726
|
+
if _false_merge_confirmed_clean and not dry_run:
|
|
3727
|
+
state.mark_false_merge_audit_clean(_false_merge_confirmed_clean)
|
|
3728
|
+
|
|
3538
3729
|
return actions
|
|
@@ -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
|