code-coordinator 0.5.316__tar.gz → 0.5.318__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/PKG-INFO +1 -1
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/scm_file_list.json +2 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/confirm_test.py +171 -2
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notify.py +132 -22
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/reconcile.py +59 -2
- code_coordinator-0.5.318/coord/repo_dormancy.py +225 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/serve_app.py +40 -4
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/conftest.py +23 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_confirm_test.py +193 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notify_drain.py +78 -4
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_merges.py +137 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_roll_window_handoff.py +11 -4
- code_coordinator-0.5.318/tests/test_repo_dormancy.py +187 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_serve.py +139 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stuck_test_state_watchdog_2803.py +18 -2
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.gitignore +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/CLAUDE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/GOAL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/LICENSE +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/MANIFEST.in +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/README.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agent.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/block_log.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/board_service.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/brain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/claim.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/client.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/comments.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dao.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/db.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deps.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/drive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/events.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/filelock.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/freshness.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/gates.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/goal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/context.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/models.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/render.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/units.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/hooks.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/interactive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/models.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/network.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/openapi.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/parentage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/plans.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/progress.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/release_window.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/reports.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/review.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/self_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/smoke.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/split_work.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/sql.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/test_author.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/test_report.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/usage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/install-agent.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/pyproject.toml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/setup.cfg +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/__init__.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/backends.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_db.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_events.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_init.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_models.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_network.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_session.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_split.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_state.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/write_parity.py +0 -0
|
@@ -126,6 +126,7 @@ coord/release_cordon.py
|
|
|
126
126
|
coord/release_propagate.py
|
|
127
127
|
coord/release_verify.py
|
|
128
128
|
coord/release_window.py
|
|
129
|
+
coord/repo_dormancy.py
|
|
129
130
|
coord/repo_edit.py
|
|
130
131
|
coord/repo_onboard.py
|
|
131
132
|
coord/reports.py
|
|
@@ -706,6 +707,7 @@ tests/test_release_window.py
|
|
|
706
707
|
tests/test_remote_auto_prune.py
|
|
707
708
|
tests/test_remote_interactive_reaper.py
|
|
708
709
|
tests/test_repo_add.py
|
|
710
|
+
tests/test_repo_dormancy.py
|
|
709
711
|
tests/test_repo_edit_2220.py
|
|
710
712
|
tests/test_repo_graph_fleet_2237.py
|
|
711
713
|
tests/test_repo_onboard_2220.py
|
{code_coordinator-0.5.316 → code_coordinator-0.5.318}/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",
|
|
@@ -171,6 +171,23 @@ CONFIRM_DEFAULT_TIMEOUT_SECONDS = 60 * 20
|
|
|
171
171
|
#: so a pass can confirm ~4 branches back to back) while the daemon-side worst
|
|
172
172
|
#: case stays a number the thin client can actually be given — see
|
|
173
173
|
#: :func:`notify_client_timeout_seconds`.
|
|
174
|
+
#:
|
|
175
|
+
#: #2975: that "~6 min serial" sizing is calibrated on THIS repo and does not
|
|
176
|
+
#: hold everywhere — quadraui's ``cargo test --features tui`` builds every
|
|
177
|
+
#: example/test executable (#305 in coordinator.yml) and blows straight past
|
|
178
|
+
#: it, and every ceiling in this module (this one, ``CONFIRM_DEFAULT_
|
|
179
|
+
#: TIMEOUT_SECONDS``, ``deploy/coord-notify.service``'s ``TimeoutStartSec``)
|
|
180
|
+
#: is bigger than ``coord-notify.timer``'s 5-minute cadence, so one such
|
|
181
|
+
#: confirmation can span several fires. Two changes close that without
|
|
182
|
+
#: shrinking this constant (which would just make the COMMON case degrade to
|
|
183
|
+
#: UNCONFIRMED instead): ``coord.notify``'s drain now dispatches pending
|
|
184
|
+
#: Test/Review/PR-opens BEFORE running any confirmation each pass, so a slow
|
|
185
|
+
#: suite on one repo can no longer queue another repo's dispatch behind it;
|
|
186
|
+
#: and :func:`expected_confirmation_seconds` remembers how long a repo's
|
|
187
|
+
#: confirmation last took, so :func:`confirmation_timeout` can recognise a
|
|
188
|
+
#: repo whose suite structurally cannot fit this budget and skip straight to
|
|
189
|
+
#: UNCONFIRMED instead of re-discovering that identical fact — and re-paying
|
|
190
|
+
#: the full ceiling for it — on every single PASS claim.
|
|
174
191
|
CONFIRM_PASS_BUDGET_SECONDS = 60 * 25
|
|
175
192
|
|
|
176
193
|
#: Don't *start* a confirmation with less than this left in the pass budget.
|
|
@@ -232,6 +249,31 @@ KIND_NO_OUTPUT = "no_output"
|
|
|
232
249
|
#: docstring's fail-direction section — this frozenset IS that safety property.
|
|
233
250
|
REFUTING_KINDS = frozenset({KIND_BUILD, KIND_SUITE})
|
|
234
251
|
|
|
252
|
+
#: #2975: kinds whose elapsed wall-clock time is a trustworthy signal of how
|
|
253
|
+
#: long THIS repo's confirmation genuinely takes, worth remembering for next
|
|
254
|
+
#: time via :func:`record_confirmation_duration`.
|
|
255
|
+
#:
|
|
256
|
+
#: ``KIND_OK``/``KIND_BUILD``/``KIND_SUITE``/``KIND_BASELINE_RED``/
|
|
257
|
+
#: ``KIND_NO_OUTPUT`` all ran the command to actual completion — a real
|
|
258
|
+
#: measurement. ``KIND_TIMEOUT`` ran for at least the ceiling it was given —
|
|
259
|
+
#: not exact, but a valid LOWER BOUND, and a lower bound is exactly what lets
|
|
260
|
+
#: a chronically-too-slow repo (quadraui's ``cargo test --features tui``
|
|
261
|
+
#: builds every example/test executable, #305 in coordinator.yml) be
|
|
262
|
+
#: recognised as such after a single attempt instead of re-discovering it on
|
|
263
|
+
#: every PASS claim — see :func:`expected_confirmation_seconds`.
|
|
264
|
+
#:
|
|
265
|
+
#: ``KIND_SETUP``/``KIND_INFRA``/``KIND_SIGNAL`` are deliberately excluded:
|
|
266
|
+
#: none of them ran the real command for a representative duration (no
|
|
267
|
+
#: checkout, no toolchain, or killed externally mid-run), and recording their
|
|
268
|
+
#: near-zero elapsed time would silently erase a previously-learned
|
|
269
|
+
#: expectation — exactly the failure mode that would make a single lock
|
|
270
|
+
#: contention hiccup or a missing checkout reset a repo's hard-won "this one
|
|
271
|
+
#: is slow" memory back to "assume it's fast."
|
|
272
|
+
RECORDABLE_DURATION_KINDS = frozenset({
|
|
273
|
+
KIND_OK, KIND_BUILD, KIND_SUITE, KIND_BASELINE_RED, KIND_NO_OUTPUT,
|
|
274
|
+
KIND_TIMEOUT,
|
|
275
|
+
})
|
|
276
|
+
|
|
235
277
|
#: Kinds meaning "the check could not reach a verdict". The caller falls back to
|
|
236
278
|
#: the worker's own claim on any of these, which is pre-#2464 behaviour.
|
|
237
279
|
INCONCLUSIVE_KINDS = frozenset({
|
|
@@ -270,7 +312,7 @@ def begin_confirmation_pass(total: float = CONFIRM_PASS_BUDGET_SECONDS) -> None:
|
|
|
270
312
|
_pass_state.remaining = float(total)
|
|
271
313
|
|
|
272
314
|
|
|
273
|
-
def confirmation_timeout() -> int | None:
|
|
315
|
+
def confirmation_timeout(expected_seconds: float | None = None) -> int | None:
|
|
274
316
|
"""Seconds the next confirmation in this pass may take, or ``None``.
|
|
275
317
|
|
|
276
318
|
``None`` means the pass budget is spent (or too nearly spent to be worth
|
|
@@ -279,13 +321,31 @@ def confirmation_timeout() -> int | None:
|
|
|
279
321
|
|
|
280
322
|
Outside a pass — a direct :func:`confirm_branch` call, a unit test — there
|
|
281
323
|
is no budget to draw down and the full per-run ceiling applies.
|
|
324
|
+
|
|
325
|
+
*expected_seconds* (#2975) is the caller's best estimate of how long THIS
|
|
326
|
+
repo's confirmation will actually take — see
|
|
327
|
+
:func:`expected_confirmation_seconds`, which reads it back from what
|
|
328
|
+
:func:`record_confirmation_duration` learned last time. When it is
|
|
329
|
+
already at or past what this pass has left to spend, starting the run
|
|
330
|
+
would only spend the remainder re-discovering a fact already on record —
|
|
331
|
+
this repo cannot be confirmed in what is left — so this returns ``None``
|
|
332
|
+
immediately instead of paying for that discovery again. This is what
|
|
333
|
+
turns a repo whose suite structurally cannot fit the ceiling (quadraui's
|
|
334
|
+
``cargo test --features tui``, #2975) from a repeated worst-case cost —
|
|
335
|
+
every PASS claim spending the full budget to learn the identical lesson —
|
|
336
|
+
into a one-time one: the FIRST attempt still spends up to the full
|
|
337
|
+
ceiling discovering the suite is too slow, and every attempt after that
|
|
338
|
+
skips straight to UNCONFIRMED.
|
|
282
339
|
"""
|
|
283
340
|
remaining = getattr(_pass_state, "remaining", None)
|
|
284
341
|
if remaining is None:
|
|
285
342
|
return int(CONFIRM_DEFAULT_TIMEOUT_SECONDS)
|
|
286
343
|
if remaining < CONFIRM_MIN_RUN_SECONDS:
|
|
287
344
|
return None
|
|
288
|
-
|
|
345
|
+
ceiling = min(float(CONFIRM_DEFAULT_TIMEOUT_SECONDS), remaining)
|
|
346
|
+
if expected_seconds is not None and expected_seconds >= ceiling:
|
|
347
|
+
return None
|
|
348
|
+
return int(ceiling)
|
|
289
349
|
|
|
290
350
|
|
|
291
351
|
def spend_confirmation_budget(seconds: float) -> None:
|
|
@@ -300,6 +360,112 @@ def spend_confirmation_budget(seconds: float) -> None:
|
|
|
300
360
|
_pass_state.remaining = max(0.0, remaining - max(0.0, float(seconds)))
|
|
301
361
|
|
|
302
362
|
|
|
363
|
+
#: #2975: filename under ``COORD_DIR`` for the per-repo measured-duration map
|
|
364
|
+
#: :func:`record_confirmation_duration` / :func:`expected_confirmation_seconds`
|
|
365
|
+
#: read and write. A tiny flat file, not a lock-guarded store: the worst case
|
|
366
|
+
#: of a torn read/write is one stale or missing estimate, which degrades to
|
|
367
|
+
#: exactly pre-#2975 behaviour (attempt the run, learn the hard way) — never
|
|
368
|
+
#: a correctness problem, so it does not warrant the ceremony
|
|
369
|
+
#: ``confirm_lock_path`` needs for the worktree lifecycle it guards.
|
|
370
|
+
_CONFIRM_HISTORY_FILENAME = "confirm_test_history.json"
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def _confirm_history_path() -> Path:
|
|
374
|
+
"""Where per-repo measured confirmation durations are persisted (#2975).
|
|
375
|
+
|
|
376
|
+
Resolved against ``coord.state.COORD_DIR`` freshly on every call — the
|
|
377
|
+
same discipline :func:`confirm_worktree_path` /
|
|
378
|
+
:func:`write_confirmation_output` already use above — so a test's
|
|
379
|
+
``monkeypatch.setattr("coord.state.COORD_DIR", ...)`` is honoured rather
|
|
380
|
+
than this module caching a stale path at import time.
|
|
381
|
+
"""
|
|
382
|
+
from coord.state import COORD_DIR # noqa: PLC0415
|
|
383
|
+
|
|
384
|
+
return COORD_DIR / _CONFIRM_HISTORY_FILENAME
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def _load_confirm_history() -> dict[str, float]:
|
|
388
|
+
"""Best-effort read of the persisted per-repo duration map.
|
|
389
|
+
|
|
390
|
+
Fail-soft on everything — a missing file, corrupt JSON, an unexpected
|
|
391
|
+
shape, a hand-edited value — because this is purely an optimisation hint
|
|
392
|
+
for :func:`confirmation_timeout`, never a correctness dependency. A file
|
|
393
|
+
this cannot make sense of must read as "nothing learned yet", the same
|
|
394
|
+
posture as :func:`coord.commands.drive_queue.read_roll_pending`.
|
|
395
|
+
"""
|
|
396
|
+
import json # noqa: PLC0415
|
|
397
|
+
|
|
398
|
+
try:
|
|
399
|
+
raw = _confirm_history_path().read_text(encoding="utf-8")
|
|
400
|
+
except OSError:
|
|
401
|
+
return {}
|
|
402
|
+
try:
|
|
403
|
+
data = json.loads(raw)
|
|
404
|
+
except ValueError:
|
|
405
|
+
return {}
|
|
406
|
+
if not isinstance(data, dict):
|
|
407
|
+
return {}
|
|
408
|
+
out: dict[str, float] = {}
|
|
409
|
+
for key, value in data.items():
|
|
410
|
+
if isinstance(key, str) and isinstance(value, (int, float)) and value > 0:
|
|
411
|
+
out[key] = float(value)
|
|
412
|
+
return out
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def record_confirmation_duration(repo_name: str, seconds: float) -> None:
|
|
416
|
+
"""Remember how long *repo_name*'s confirmation attempt just took (#2975).
|
|
417
|
+
|
|
418
|
+
Callers pass this only results whose ``kind`` is in
|
|
419
|
+
:data:`RECORDABLE_DURATION_KINDS` — see that frozenset's docstring for
|
|
420
|
+
which outcomes are a trustworthy signal of real suite duration.
|
|
421
|
+
|
|
422
|
+
Overwrites any previous value for this repo outright, with no averaging:
|
|
423
|
+
the LAST attempt is a better estimate of the CURRENT suite than a rolling
|
|
424
|
+
average across however long ago the repo's test suite was this size.
|
|
425
|
+
|
|
426
|
+
Best-effort and atomic (tempfile-then-rename, mirroring
|
|
427
|
+
:func:`coord.commands.drive_queue.write_roll_pending`) — a full disk, an
|
|
428
|
+
unwritable ``COORD_DIR``, or a concurrent writer must not break the
|
|
429
|
+
confirmation this is charging against; the caller already has its real
|
|
430
|
+
result, this is purely a hint for next time.
|
|
431
|
+
"""
|
|
432
|
+
if seconds <= 0:
|
|
433
|
+
return
|
|
434
|
+
import json # noqa: PLC0415
|
|
435
|
+
import tempfile # noqa: PLC0415
|
|
436
|
+
|
|
437
|
+
path = _confirm_history_path()
|
|
438
|
+
history = _load_confirm_history()
|
|
439
|
+
history[repo_name] = float(seconds)
|
|
440
|
+
try:
|
|
441
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
442
|
+
fd, tmp_name = tempfile.mkstemp(
|
|
443
|
+
prefix=".confirm_test_history.", suffix=".tmp", dir=str(path.parent),
|
|
444
|
+
)
|
|
445
|
+
try:
|
|
446
|
+
with os.fdopen(fd, "w", encoding="utf-8") as fh:
|
|
447
|
+
json.dump(history, fh)
|
|
448
|
+
os.replace(tmp_name, path)
|
|
449
|
+
except OSError:
|
|
450
|
+
try:
|
|
451
|
+
os.unlink(tmp_name)
|
|
452
|
+
except OSError:
|
|
453
|
+
pass
|
|
454
|
+
except OSError:
|
|
455
|
+
pass
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
def expected_confirmation_seconds(repo_name: str) -> float | None:
|
|
459
|
+
"""The most recently measured confirmation duration for *repo_name*.
|
|
460
|
+
|
|
461
|
+
``None`` when this repo has never produced a
|
|
462
|
+
:data:`RECORDABLE_DURATION_KINDS` result — the common case for most
|
|
463
|
+
repos most of the time, and the caller's cue to fall back to the
|
|
464
|
+
un-informed ceiling exactly as before #2975.
|
|
465
|
+
"""
|
|
466
|
+
return _load_confirm_history().get(repo_name)
|
|
467
|
+
|
|
468
|
+
|
|
303
469
|
def notify_client_timeout_seconds(
|
|
304
470
|
budget: float = CONFIRM_PASS_BUDGET_SECONDS,
|
|
305
471
|
) -> float:
|
|
@@ -1067,6 +1233,7 @@ __all__ = [
|
|
|
1067
1233
|
"KIND_SIGNAL",
|
|
1068
1234
|
"NOTIFY_BASE_CLIENT_TIMEOUT_SECONDS",
|
|
1069
1235
|
"PERMISSION_DENIED_EXIT",
|
|
1236
|
+
"RECORDABLE_DURATION_KINDS",
|
|
1070
1237
|
"REFUTING_KINDS",
|
|
1071
1238
|
"STALE_WORKTREE_MAX_AGE_HOURS",
|
|
1072
1239
|
"ConfirmationResult",
|
|
@@ -1077,7 +1244,9 @@ __all__ = [
|
|
|
1077
1244
|
"confirm_worktree_path",
|
|
1078
1245
|
"confirmation_enabled",
|
|
1079
1246
|
"confirmation_timeout",
|
|
1247
|
+
"expected_confirmation_seconds",
|
|
1080
1248
|
"notify_client_timeout_seconds",
|
|
1249
|
+
"record_confirmation_duration",
|
|
1081
1250
|
"spend_confirmation_budget",
|
|
1082
1251
|
"sweep_stale_confirm_worktrees",
|
|
1083
1252
|
"unmet_confirmation_capabilities",
|
|
@@ -2033,9 +2033,12 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
|
|
|
2033
2033
|
that cannot run must degrade to pre-#2464 behaviour, never break the reap.
|
|
2034
2034
|
"""
|
|
2035
2035
|
from coord.confirm_test import ( # noqa: PLC0415
|
|
2036
|
+
RECORDABLE_DURATION_KINDS,
|
|
2036
2037
|
confirm_branch,
|
|
2037
2038
|
confirmation_enabled,
|
|
2038
2039
|
confirmation_timeout,
|
|
2040
|
+
expected_confirmation_seconds,
|
|
2041
|
+
record_confirmation_duration,
|
|
2039
2042
|
spend_confirmation_budget,
|
|
2040
2043
|
)
|
|
2041
2044
|
|
|
@@ -2066,15 +2069,34 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
|
|
|
2066
2069
|
# `/notify` request the thin client is blocked on — scale with board
|
|
2067
2070
|
# activity. Exhausted budget means UNCONFIRMED, which is pre-#2464
|
|
2068
2071
|
# behaviour, and it is said out loud rather than truncating silently.
|
|
2069
|
-
|
|
2072
|
+
#
|
|
2073
|
+
# #2975: also hand in whatever this repo's OWN last confirmation measured
|
|
2074
|
+
# (`expected_confirmation_seconds`) — a repo whose suite structurally
|
|
2075
|
+
# cannot finish inside the budget (quadraui's `cargo test --features
|
|
2076
|
+
# tui`) would otherwise spend the full ceiling relearning that identical
|
|
2077
|
+
# fact on every single PASS claim, serialising every other repo's Test/
|
|
2078
|
+
# Review dispatch behind it each time. Knowing the answer already lets
|
|
2079
|
+
# `confirmation_timeout` skip straight to UNCONFIRMED instead.
|
|
2080
|
+
expected = expected_confirmation_seconds(transition.repo_name)
|
|
2081
|
+
timeout = confirmation_timeout(expected)
|
|
2070
2082
|
if timeout is None:
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2083
|
+
if expected is not None:
|
|
2084
|
+
log.warning(
|
|
2085
|
+
"smoke %s: %s's last measured confirmation took about %.0fs, "
|
|
2086
|
+
"at or beyond what this pass has left to spend — skipping "
|
|
2087
|
+
"the run and recording the worker's own claim UNCONFIRMED "
|
|
2088
|
+
"rather than repeating a run already known not to finish "
|
|
2089
|
+
"(#2975).",
|
|
2090
|
+
transition.assignment_id, transition.repo_name, expected,
|
|
2091
|
+
)
|
|
2092
|
+
else:
|
|
2093
|
+
log.warning(
|
|
2094
|
+
"smoke %s: this notify pass has spent its confirmation budget "
|
|
2095
|
+
"(coord.confirm_test.CONFIRM_PASS_BUDGET_SECONDS) — recording the "
|
|
2096
|
+
"worker's own claim for %s UNCONFIRMED rather than holding "
|
|
2097
|
+
"notify.lock any longer (#2464).",
|
|
2098
|
+
transition.assignment_id, transition.repo_name,
|
|
2099
|
+
)
|
|
2078
2100
|
return None
|
|
2079
2101
|
|
|
2080
2102
|
branch = entry.get("branch")
|
|
@@ -2084,10 +2106,12 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
|
|
|
2084
2106
|
transition.assignment_id, transition.repo_name, branch, timeout,
|
|
2085
2107
|
)
|
|
2086
2108
|
started = time.monotonic()
|
|
2109
|
+
result: ConfirmationResult | None = None
|
|
2087
2110
|
try:
|
|
2088
|
-
|
|
2111
|
+
result = confirm_branch(
|
|
2089
2112
|
transition.repo_name, branch, config, timeout=timeout,
|
|
2090
2113
|
)
|
|
2114
|
+
return result
|
|
2091
2115
|
except Exception as exc: # noqa: BLE001
|
|
2092
2116
|
log.warning(
|
|
2093
2117
|
"smoke %s: confirmation run raised (%s) — falling back to the "
|
|
@@ -2100,7 +2124,15 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
|
|
|
2100
2124
|
# It really did hold the drain (and `notify.lock`) for those seconds,
|
|
2101
2125
|
# and a run that reliably blows up after ten minutes must not be able
|
|
2102
2126
|
# to repeat that for every row on the board free of charge.
|
|
2103
|
-
|
|
2127
|
+
elapsed = time.monotonic() - started
|
|
2128
|
+
spend_confirmation_budget(elapsed)
|
|
2129
|
+
# #2975: only remember the duration when the result is actually a
|
|
2130
|
+
# trustworthy measurement (see RECORDABLE_DURATION_KINDS) — an
|
|
2131
|
+
# exception, a disabled config load, or a KIND_SETUP/INFRA/SIGNAL
|
|
2132
|
+
# short-circuit tells us nothing about how long the real suite takes
|
|
2133
|
+
# and must never overwrite a previously-learned expectation.
|
|
2134
|
+
if result is not None and result.kind in RECORDABLE_DURATION_KINDS:
|
|
2135
|
+
record_confirmation_duration(transition.repo_name, elapsed)
|
|
2104
2136
|
|
|
2105
2137
|
|
|
2106
2138
|
def _confirmed_pass_verdict(
|
|
@@ -4155,6 +4187,20 @@ def run_drain(
|
|
|
4155
4187
|
*notifications*, not pipeline advancement, and giving the daemon a
|
|
4156
4188
|
periodic detector is #1632's job (which is blocked on this).
|
|
4157
4189
|
|
|
4190
|
+
**Dispatch order (#2975).** Smoke/review/PR-open dispatch also runs as a
|
|
4191
|
+
HEAD START right at the top of the pass, before this pass's own
|
|
4192
|
+
transition detection (which is where a #2464 out-of-band confirmation
|
|
4193
|
+
runs — see :mod:`coord.confirm_test`). A confirmation re-runs a repo's
|
|
4194
|
+
real build+test synchronously and can hold this very lock for the whole
|
|
4195
|
+
confirmation-pass budget, several timer fires' worth for a repo whose
|
|
4196
|
+
suite is structurally too slow. Every row already eligible for dispatch
|
|
4197
|
+
as of the top of the pass must not queue behind that — a slow suite on
|
|
4198
|
+
one repo must delay only its own confirmation, never another repo's
|
|
4199
|
+
Test/Review dispatch. The three dispatch functions run a second time
|
|
4200
|
+
afterward too, in their historical place, to pick up anything the
|
|
4201
|
+
transition-detection step below made newly eligible; all three are
|
|
4202
|
+
idempotent, so the repeat costs only a second, mostly-empty scan.
|
|
4203
|
+
|
|
4158
4204
|
**Concurrency.** The whole pass runs under ``~/.coord/notify.lock`` —
|
|
4159
4205
|
literally :class:`coord.filelock.FileLock`, the same class on the same
|
|
4160
4206
|
path ``coord drive``'s ``run_notify()`` takes — so a drive's nudge and the
|
|
@@ -4203,6 +4249,56 @@ def _run_drain_locked(config: Config) -> DrainResult:
|
|
|
4203
4249
|
|
|
4204
4250
|
begin_confirmation_pass()
|
|
4205
4251
|
|
|
4252
|
+
# Step 0a (#2803, moved up by #2975): clear any work row wedged at
|
|
4253
|
+
# test_state='running' well past its Test-stage child's own terminal
|
|
4254
|
+
# resolution (or absence) — a lost verdict write, never a fabricated one
|
|
4255
|
+
# (see `sweep_stuck_test_state_rows`'s docstring). It still runs BEFORE
|
|
4256
|
+
# every smoke dispatch in this pass, which is #2803's invariant: a row
|
|
4257
|
+
# this clears is picked up and redispatched in THIS SAME pass, not the
|
|
4258
|
+
# next one. It now runs before step 0b's head start as well, so a row it
|
|
4259
|
+
# clears gets that head start too rather than waiting behind step 1's
|
|
4260
|
+
# confirmations. Nothing is lost by sweeping before transition detection:
|
|
4261
|
+
# every case the sweep acts on is gated on
|
|
4262
|
+
# `STUCK_TEST_STATE_GRACE_SECONDS` (10 minutes) having elapsed since the
|
|
4263
|
+
# child's own resolution, so a child that only just went terminal in
|
|
4264
|
+
# THIS pass is out of scope either way.
|
|
4265
|
+
try:
|
|
4266
|
+
_sweep_stuck_test_state(config)
|
|
4267
|
+
except Exception: # noqa: BLE001
|
|
4268
|
+
log.exception("notify drain: stuck test_state sweep failed")
|
|
4269
|
+
|
|
4270
|
+
# Step 0b (#2975): dispatch pending Test-stage smoke / PR-opens / reviews
|
|
4271
|
+
# from the board exactly as it reads RIGHT NOW — before step 1 below gets
|
|
4272
|
+
# anywhere near a `confirm_branch` call. A confirmation re-runs one
|
|
4273
|
+
# repo's real build+test synchronously inside THIS pass and can
|
|
4274
|
+
# legitimately hold `notify.lock` for the whole `CONFIRM_PASS_BUDGET_
|
|
4275
|
+
# SECONDS` ceiling — several `coord-notify.timer` fires' worth (#2975).
|
|
4276
|
+
# Every row already eligible for dispatch as of the top of this pass
|
|
4277
|
+
# must not queue behind that: a slow suite on one repo should delay only
|
|
4278
|
+
# its own confirmation, never another repo's Test/Review dispatch.
|
|
4279
|
+
#
|
|
4280
|
+
# Steps 2-3 below repeat these same three calls after the transition
|
|
4281
|
+
# detection has had a chance to add anything newly eligible (a work leg
|
|
4282
|
+
# that just finished, a PR that just opened) — this head start is
|
|
4283
|
+
# additive, not a replacement.
|
|
4284
|
+
# All three are idempotent (`_dispatch_board_pending_pr_opens`'s and
|
|
4285
|
+
# `_dispatch_board_pending_smoke`'s own docstrings: "safe to call even
|
|
4286
|
+
# when the board file doesn't exist", find-or-create PRs, dedupe via
|
|
4287
|
+
# `has_active_followup`), so calling each twice in one pass costs
|
|
4288
|
+
# nothing beyond a second, mostly-empty scan.
|
|
4289
|
+
try:
|
|
4290
|
+
_dispatch_board_pending_pr_opens(config)
|
|
4291
|
+
except Exception: # noqa: BLE001
|
|
4292
|
+
log.exception("notify drain: head-start PR-open dispatch failed")
|
|
4293
|
+
try:
|
|
4294
|
+
_dispatch_board_pending_smoke(config)
|
|
4295
|
+
except Exception: # noqa: BLE001
|
|
4296
|
+
log.exception("notify drain: head-start smoke dispatch failed")
|
|
4297
|
+
try:
|
|
4298
|
+
_dispatch_board_pending_reviews(config)
|
|
4299
|
+
except Exception: # noqa: BLE001
|
|
4300
|
+
log.exception("notify drain: head-start review dispatch failed")
|
|
4301
|
+
|
|
4206
4302
|
# Step 1: post completion/failure/advisory/plan/review comments for rows
|
|
4207
4303
|
# the agent reports terminal. This is what stamps `finished_at` (via
|
|
4208
4304
|
# mark_notified) and captures cost / SMOKE_TESTS / summary / session id /
|
|
@@ -4234,18 +4330,7 @@ def _run_drain_locked(config: Config) -> DrainResult:
|
|
|
4234
4330
|
except Exception: # noqa: BLE001
|
|
4235
4331
|
log.exception("notify drain: detect_transitions failed")
|
|
4236
4332
|
|
|
4237
|
-
# Step 2 (#
|
|
4238
|
-
# past its Test-stage child's own terminal resolution (or absence) — a
|
|
4239
|
-
# lost verdict write, never a fabricated one (see `sweep_stuck_test_
|
|
4240
|
-
# state_rows`'s docstring). Runs BEFORE step 3's smoke dispatch so a row
|
|
4241
|
-
# this clears is picked up and redispatched in THIS SAME pass, not the
|
|
4242
|
-
# next one.
|
|
4243
|
-
try:
|
|
4244
|
-
_sweep_stuck_test_state(config)
|
|
4245
|
-
except Exception: # noqa: BLE001
|
|
4246
|
-
log.exception("notify drain: stuck test_state sweep failed")
|
|
4247
|
-
|
|
4248
|
-
# Step 2.5 (#2844): open PRs for work-leg completions still missing one —
|
|
4333
|
+
# Step 2 (#2844): open PRs for work-leg completions still missing one —
|
|
4249
4334
|
# BEFORE the Test-stage dispatch below, so the pull_request CI run starts
|
|
4250
4335
|
# overlapping smoke instead of waiting for review dispatch to open the
|
|
4251
4336
|
# PR ~20 minutes later.
|
|
@@ -4447,6 +4532,31 @@ def run(
|
|
|
4447
4532
|
# why this reads the marker but never writes it.
|
|
4448
4533
|
_roll_pending = _roll_pending_blocks_new_dispatch()
|
|
4449
4534
|
|
|
4535
|
+
# Step 0 (#2975): same head start `_run_drain_locked` takes, and for the
|
|
4536
|
+
# identical reason — dispatch pending Test-stage smoke / PR-opens /
|
|
4537
|
+
# reviews from the board exactly as it reads RIGHT NOW, before the
|
|
4538
|
+
# transition-detection loop below gets anywhere near a `confirm_branch`
|
|
4539
|
+
# call that can hold `notify.lock` for up to `CONFIRM_PASS_BUDGET_
|
|
4540
|
+
# SECONDS`. Gated on `_roll_pending` like every other NEW-leg dispatch in
|
|
4541
|
+
# this function (#2587) — the later calls to the same three functions,
|
|
4542
|
+
# a few dozen lines down, repeat this after the loop below has had a
|
|
4543
|
+
# chance to add anything newly eligible; this is a head start, not a
|
|
4544
|
+
# replacement, and all three are idempotent so calling each twice costs
|
|
4545
|
+
# only a second, mostly-empty scan.
|
|
4546
|
+
if not _roll_pending:
|
|
4547
|
+
try:
|
|
4548
|
+
_dispatch_board_pending_pr_opens(config)
|
|
4549
|
+
except Exception: # noqa: BLE001
|
|
4550
|
+
pass
|
|
4551
|
+
try:
|
|
4552
|
+
_dispatch_board_pending_smoke(config)
|
|
4553
|
+
except Exception: # noqa: BLE001
|
|
4554
|
+
pass
|
|
4555
|
+
try:
|
|
4556
|
+
_dispatch_board_pending_reviews(config)
|
|
4557
|
+
except Exception: # noqa: BLE001
|
|
4558
|
+
pass
|
|
4559
|
+
|
|
4450
4560
|
# #522: one terminal-state cache shared across every gh-hitting check in
|
|
4451
4561
|
# this notify run (the auto-loop review/fix dispatches below, and the
|
|
4452
4562
|
# #1441 stalled-pipeline sweep at the end), so a burst of activity for
|
|
@@ -2791,9 +2791,11 @@ def _extract_issue_number(branch: str) -> int | None:
|
|
|
2791
2791
|
def close_stale_prs(
|
|
2792
2792
|
config: Config,
|
|
2793
2793
|
*,
|
|
2794
|
+
board: Board | None = None,
|
|
2794
2795
|
repo: str | None = None,
|
|
2795
2796
|
issue: int | None = None,
|
|
2796
2797
|
dry_run: bool = False,
|
|
2798
|
+
skip_dormant_repos: bool = False,
|
|
2797
2799
|
) -> list[str]:
|
|
2798
2800
|
"""Close open PRs whose work is already on main or whose issue is closed.
|
|
2799
2801
|
|
|
@@ -2808,15 +2810,46 @@ def close_stale_prs(
|
|
|
2808
2810
|
|
|
2809
2811
|
Stale PRs are closed with an explanatory comment. Non-stale PRs are left
|
|
2810
2812
|
untouched. *dry_run* lists what would change without writing. Idempotent.
|
|
2813
|
+
|
|
2814
|
+
#2994: when *skip_dormant_repos* is set (the daemon tick's opt-in — see
|
|
2815
|
+
``coord.serve_app._reconcile_merges_tick``; a manual ``coord
|
|
2816
|
+
reconcile-merges`` leaves this False), a repo with no open assignment, no
|
|
2817
|
+
drive-queue entry, and no coord-authored open PR (``coord.repo_dormancy.
|
|
2818
|
+
should_skip_sweep``) is skipped this call rather than costing a
|
|
2819
|
+
``list_open_prs`` call — bounded by ``coord.repo_dormancy.
|
|
2820
|
+
DORMANT_SWEEP_FLOOR_S`` so it's still swept eventually. Requires *board*
|
|
2821
|
+
to evaluate; with *board* left ``None`` this is a no-op regardless of
|
|
2822
|
+
*skip_dormant_repos* (no activity signal to check against, so never
|
|
2823
|
+
skip).
|
|
2824
|
+
|
|
2825
|
+
Note: the floor is recorded as soon as a repo is deemed due, before
|
|
2826
|
+
``list_open_prs`` is even attempted, and it stays recorded if that call
|
|
2827
|
+
then raises (deliberate — see ``coord.repo_dormancy.record_swept``'s
|
|
2828
|
+
docstring: it tracks "a real gh call was spent", not "and it worked").
|
|
2829
|
+
One operator-facing consequence: a repo that is persistently failing
|
|
2830
|
+
(renamed, deleted, secondary-rate-limited) goes quiet for up to
|
|
2831
|
+
``DORMANT_SWEEP_FLOOR_S`` between retries rather than being retried
|
|
2832
|
+
sooner, same as a genuinely idle repo would be.
|
|
2811
2833
|
"""
|
|
2812
2834
|
from coord import github_ops # noqa: PLC0415
|
|
2813
2835
|
|
|
2814
2836
|
actions: list[str] = []
|
|
2837
|
+
dormant_skipped = 0
|
|
2815
2838
|
|
|
2816
2839
|
for repo_cfg in config.repos:
|
|
2817
2840
|
if repo is not None and repo_cfg.name != repo:
|
|
2818
2841
|
continue
|
|
2819
2842
|
|
|
2843
|
+
if skip_dormant_repos and board is not None:
|
|
2844
|
+
from coord import repo_dormancy # noqa: PLC0415
|
|
2845
|
+
|
|
2846
|
+
if repo_dormancy.should_skip_sweep(
|
|
2847
|
+
repo_cfg.name, board, repo_dormancy.KIND_PRS
|
|
2848
|
+
):
|
|
2849
|
+
dormant_skipped += 1
|
|
2850
|
+
continue
|
|
2851
|
+
repo_dormancy.record_swept(repo_cfg.name, repo_dormancy.KIND_PRS)
|
|
2852
|
+
|
|
2820
2853
|
try:
|
|
2821
2854
|
open_prs = github_ops.list_open_prs(repo_cfg.github)
|
|
2822
2855
|
except Exception as exc: # noqa: BLE001
|
|
@@ -2891,6 +2924,14 @@ def close_stale_prs(
|
|
|
2891
2924
|
except Exception as exc: # noqa: BLE001
|
|
2892
2925
|
actions.append(f" ↳ error closing PR #{pr_number}: {exc}")
|
|
2893
2926
|
|
|
2927
|
+
if dormant_skipped:
|
|
2928
|
+
# #2994: one aggregate line rather than one per repo — visible
|
|
2929
|
+
# without being noisy on a fleet with many idle repos.
|
|
2930
|
+
actions.append(
|
|
2931
|
+
f"stale-PR sweep: skipped {dormant_skipped} dormant repo(s) "
|
|
2932
|
+
"(no open assignment, drive-queue entry, or open PR)"
|
|
2933
|
+
)
|
|
2934
|
+
|
|
2894
2935
|
return actions
|
|
2895
2936
|
|
|
2896
2937
|
|
|
@@ -2926,6 +2967,7 @@ def reconcile_board_merges(
|
|
|
2926
2967
|
issue: int | None = None,
|
|
2927
2968
|
dry_run: bool = False,
|
|
2928
2969
|
throttle_false_merge_audit: bool = False,
|
|
2970
|
+
skip_dormant_repos: bool = False,
|
|
2929
2971
|
) -> list[str]:
|
|
2930
2972
|
"""Reconcile done work assignments against git/GitHub reality.
|
|
2931
2973
|
|
|
@@ -2995,7 +3037,13 @@ def reconcile_board_merges(
|
|
|
2995
3037
|
the daemon's 30s tick (97% of a pass's ``gh`` calls). Set
|
|
2996
3038
|
*throttle_false_merge_audit* to run that sweep at most hourly; the
|
|
2997
3039
|
daemon tick does, a manual ``coord reconcile-merges`` deliberately does
|
|
2998
|
-
not. See the inline block above ``_false_merge_candidates``.
|
|
3040
|
+
not. See the inline block above ``_false_merge_candidates``.
|
|
3041
|
+
|
|
3042
|
+
#2994: *skip_dormant_repos* (also daemon-tick-only, also off for a
|
|
3043
|
+
manual ``coord reconcile-merges``) is threaded through to sweep (c),
|
|
3044
|
+
:func:`close_stale_prs` — see its own docstring — so a repo with no open
|
|
3045
|
+
assignment, no drive-queue entry, and no coord-authored open PR doesn't
|
|
3046
|
+
cost a ``list_open_prs`` call on every tick either.)
|
|
2999
3047
|
"""
|
|
3000
3048
|
from coord import github_ops, state # noqa: PLC0415
|
|
3001
3049
|
|
|
@@ -3139,7 +3187,16 @@ def reconcile_board_merges(
|
|
|
3139
3187
|
state.mark_work_review_settled(a.assignment_id or "")
|
|
3140
3188
|
|
|
3141
3189
|
# (c) #721 — close open PRs whose work has already landed.
|
|
3142
|
-
actions.extend(
|
|
3190
|
+
actions.extend(
|
|
3191
|
+
close_stale_prs(
|
|
3192
|
+
config,
|
|
3193
|
+
board=board,
|
|
3194
|
+
repo=repo,
|
|
3195
|
+
issue=issue,
|
|
3196
|
+
dry_run=dry_run,
|
|
3197
|
+
skip_dormant_repos=skip_dormant_repos,
|
|
3198
|
+
)
|
|
3199
|
+
)
|
|
3143
3200
|
|
|
3144
3201
|
# (d) #732 — prune stale merge_queue entries for closed issues / merged PRs.
|
|
3145
3202
|
# Runs after the board sweeps so a just-marked-merged assignment doesn't
|