code-coordinator 0.5.325__tar.gz → 0.5.327__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.325 → code_coordinator-0.5.327}/PKG-INFO +1 -1
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/drive_queue.py +50 -6
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/dao.py +11 -1
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/db.py +132 -1
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/merge_queue.py +14 -2
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/state.py +44 -7
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_drive_queue.py +67 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_dao.py +82 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_db.py +403 -33
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_merge_queue.py +95 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_state.py +143 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/.gitignore +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/CLAUDE.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/GOAL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/LICENSE +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/MANIFEST.in +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/README.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/__init__.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/agent.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/audit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/block_log.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/board_service.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/brain.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/claim.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/cli.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/client.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/comments.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/config.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/deps.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/drive.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/events.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/filelock.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/freshness.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/gates.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/goal.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/context.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/models.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/render.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/health/units.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/hooks.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/interactive.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/models.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/network.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/notify.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/openapi.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/parentage.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/plans.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/progress.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/release_window.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/reports.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/review.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/self_health.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/smoke.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/split_work.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/sql.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/test_author.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/test_report.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/usage.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/install-agent.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/pyproject.toml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/setup.cfg +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/__init__.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/backends.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/conftest.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_config.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_events.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_init.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_models.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_network.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_review.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_session.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_split.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.325 → code_coordinator-0.5.327}/tests/write_parity.py +0 -0
|
@@ -3534,6 +3534,54 @@ def _fetch_live_ci_gate(
|
|
|
3534
3534
|
return overrides, reasons
|
|
3535
3535
|
|
|
3536
3536
|
|
|
3537
|
+
def _index_merge_queue_by_key(rows: list, board: Any) -> dict[str, Any]:
|
|
3538
|
+
"""``{entry_key: row}`` for every *rows* (``coord.merge_queue.QueuedMerge``),
|
|
3539
|
+
plus a SECOND key for each row's #1553 *effective* issue when it differs
|
|
3540
|
+
from the row's own ``issue_number`` (#3012).
|
|
3541
|
+
|
|
3542
|
+
``QueuedMerge.issue_number`` is always the assignment's BOOKED-TO issue —
|
|
3543
|
+
``merge_queue.enqueue``/``refresh_entry_assignment`` set it straight from
|
|
3544
|
+
``assignment.issue_number`` — which for an oracle-loop acceptance slice is
|
|
3545
|
+
the milestone's tracking/epic issue, never the slice's own issue. A
|
|
3546
|
+
drive-queue entry for the slice is keyed on the SLICE issue (`entry_key`
|
|
3547
|
+
over the queue row's own `.issue`, `coord/drive_queue.py`), so looking the
|
|
3548
|
+
merge row up by that key alone always misses it — reported as "no
|
|
3549
|
+
merge-queue row for this entry" (unreadable, "retry might help") even
|
|
3550
|
+
though the row exists, is perfectly readable, and may sit in a terminal
|
|
3551
|
+
state like `human_required` that no retry will ever change
|
|
3552
|
+
(coord-portal#164, 2026-08-31).
|
|
3553
|
+
|
|
3554
|
+
Mirrors ``coord.gates.build_gate_report``'s own resolution (``a.issue_
|
|
3555
|
+
number == issue_number or effective_issue_number(a) == issue_number``) by
|
|
3556
|
+
cross-referencing each row's ``assignment_id`` against the board to find
|
|
3557
|
+
its ``for_issue_number``. Best-effort: a board that can't be walked (a
|
|
3558
|
+
bare stub in a unit test, or an ``assignment_id`` with no matching board
|
|
3559
|
+
row) just skips the second key — the row stays reachable by its own
|
|
3560
|
+
``issue_number``, exactly as before this fix.
|
|
3561
|
+
"""
|
|
3562
|
+
from coord.models import effective_issue_number # noqa: PLC0415
|
|
3563
|
+
|
|
3564
|
+
assignments_by_id: dict[str, Any] = {}
|
|
3565
|
+
try:
|
|
3566
|
+
assignments_by_id = {
|
|
3567
|
+
a.assignment_id: a
|
|
3568
|
+
for a in (list(board.active) + list(board.completed))
|
|
3569
|
+
if getattr(a, "assignment_id", None)
|
|
3570
|
+
}
|
|
3571
|
+
except Exception: # noqa: BLE001 — best-effort enrichment only, see docstring
|
|
3572
|
+
assignments_by_id = {}
|
|
3573
|
+
|
|
3574
|
+
indexed: dict[str, Any] = {}
|
|
3575
|
+
for q in rows:
|
|
3576
|
+
indexed.setdefault(entry_key(q.repo_name, q.issue_number), q)
|
|
3577
|
+
a = assignments_by_id.get(getattr(q, "assignment_id", None))
|
|
3578
|
+
if a is not None:
|
|
3579
|
+
effective = effective_issue_number(a)
|
|
3580
|
+
if effective and effective != q.issue_number:
|
|
3581
|
+
indexed.setdefault(entry_key(q.repo_name, effective), q)
|
|
3582
|
+
return indexed
|
|
3583
|
+
|
|
3584
|
+
|
|
3537
3585
|
def _fetch_live_blocked_gate(
|
|
3538
3586
|
entries: list, config_path: Path | None
|
|
3539
3587
|
) -> tuple[dict[str, bool], dict[str, str]]:
|
|
@@ -3643,9 +3691,7 @@ def _fetch_live_blocked_gate(
|
|
|
3643
3691
|
ci_store = build_ci_store(
|
|
3644
3692
|
cfg.ci_store.type, host=cfg.ci_store.host, token_env=cfg.ci_store.token_env
|
|
3645
3693
|
)
|
|
3646
|
-
queue_by_key =
|
|
3647
|
-
entry_key(q.repo_name, q.issue_number): q for q in _mq.load_queue()
|
|
3648
|
-
}
|
|
3694
|
+
queue_by_key = _index_merge_queue_by_key(_mq.load_queue(), board)
|
|
3649
3695
|
except Exception as exc: # noqa: BLE001 — see the fail-soft note above
|
|
3650
3696
|
log.warning(
|
|
3651
3697
|
"blocked-gate sweep (#2806): could not build board/config/queue "
|
|
@@ -3663,9 +3709,7 @@ def _fetch_live_blocked_gate(
|
|
|
3663
3709
|
if any(queue_by_key.get(e.key) is None for e in targets):
|
|
3664
3710
|
try:
|
|
3665
3711
|
_mq.enqueue_approved_work(cfg, board)
|
|
3666
|
-
queue_by_key =
|
|
3667
|
-
entry_key(q.repo_name, q.issue_number): q for q in _mq.load_queue()
|
|
3668
|
-
}
|
|
3712
|
+
queue_by_key = _index_merge_queue_by_key(_mq.load_queue(), board)
|
|
3669
3713
|
except Exception as exc: # noqa: BLE001 — self-heal is best-effort
|
|
3670
3714
|
log.warning(
|
|
3671
3715
|
"blocked-gate sweep (#2806): enqueue_approved_work self-heal "
|
|
@@ -393,6 +393,15 @@ class SqliteStore:
|
|
|
393
393
|
forward-compatible stand-in the issue asks for (#1039 can replace the
|
|
394
394
|
semantics without a wire-shape change — it's still one integer).
|
|
395
395
|
Fail-open to 0 so a missing/pre-migration table never 503s the board.
|
|
396
|
+
|
|
397
|
+
#2983: that fail-open needs a rollback to actually be fail-open on
|
|
398
|
+
Postgres. This runs inside a caller's ``with closing(self._connect())``
|
|
399
|
+
block alongside many other reads (``_board_meta``, ``_round_number``,
|
|
400
|
+
every ``_table`` call in ``board_projection``), and Postgres aborts the
|
|
401
|
+
whole transaction on a failed statement — so a missing ``audit_log``
|
|
402
|
+
took out every *sibling* read on that connection too, producing
|
|
403
|
+
precisely the 503 this guard exists to prevent. Nothing uncommitted
|
|
404
|
+
can be lost: ``SqliteStore``'s connections are opened read-only.
|
|
396
405
|
"""
|
|
397
406
|
try:
|
|
398
407
|
cutoff = time.time() - _AUDIT_RECENT_WINDOW_SECONDS
|
|
@@ -400,7 +409,8 @@ class SqliteStore:
|
|
|
400
409
|
conn, "SELECT COUNT(*) AS n FROM audit_log WHERE ts >= ?", (cutoff,)
|
|
401
410
|
).fetchone()
|
|
402
411
|
return int(row["n"]) if row else 0
|
|
403
|
-
except sql.driver_error(conn):
|
|
412
|
+
except sql.driver_error(conn) as exc:
|
|
413
|
+
db_mod.rollback_after_driver_error(conn, exc) # #2983: caller reuses `conn`
|
|
404
414
|
return 0
|
|
405
415
|
|
|
406
416
|
# ── public reads ────────────────────────────────────────────────────────────
|
|
@@ -429,6 +429,79 @@ def close() -> None:
|
|
|
429
429
|
|
|
430
430
|
_T = TypeVar("_T")
|
|
431
431
|
|
|
432
|
+
|
|
433
|
+
# ── Recovering a connection after a swallowed driver error (#2983) ──────────
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
def _board_connection_if_open() -> Any | None:
|
|
437
|
+
"""This process's already-open board connection, or ``None`` (#2983).
|
|
438
|
+
|
|
439
|
+
Deliberately NOT :func:`get_connection`: this is called from inside a
|
|
440
|
+
driver-error handler, where *opening* a connection that wasn't open
|
|
441
|
+
before would be a surprising side effect (and, on the SQLite path,
|
|
442
|
+
would create the database file). It only ever hands back a connection
|
|
443
|
+
something else already opened — the ``override_connection()``/SQLite
|
|
444
|
+
singleton, else THIS thread's Postgres connection, mirroring
|
|
445
|
+
:func:`get_connection`'s own precedence order.
|
|
446
|
+
"""
|
|
447
|
+
if _conn is not None:
|
|
448
|
+
return _conn
|
|
449
|
+
return getattr(_pg_thread_local, "conn", None)
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def rollback_after_driver_error(conn: Any | None, exc: BaseException) -> None:
|
|
453
|
+
"""Clear the aborted transaction *exc* left behind on *conn*, so a
|
|
454
|
+
handler that swallowed *exc* and keeps using the same connection still
|
|
455
|
+
has a usable one (#2983).
|
|
456
|
+
|
|
457
|
+
**The rule this implements.** After catching a driver error through the
|
|
458
|
+
dialect seam (``except sql.driver_error(conn):`` /
|
|
459
|
+
``except sql.driver_errors():``), a handler that intends to CONTINUE on
|
|
460
|
+
the same connection must roll back first. A handler that re-raises need
|
|
461
|
+
not. Postgres aborts the *whole* transaction on any failed statement,
|
|
462
|
+
so without this every statement issued afterwards on that connection —
|
|
463
|
+
for the rest of the process, since ``coord.db``'s connection is a
|
|
464
|
+
process-/thread-lived singleton — raises
|
|
465
|
+
``psycopg.errors.InFailedSqlTransaction``. That is what made the whole
|
|
466
|
+
#2597/#2689/#2784 degrade-gracefully layer inert or actively harmful on
|
|
467
|
+
the second backend: guards written to *prevent* a crash caused one.
|
|
468
|
+
SQLite has no such concept — a failed statement there leaves the
|
|
469
|
+
connection perfectly usable — which is exactly why every one of these
|
|
470
|
+
21 handler sites read as correct for years.
|
|
471
|
+
|
|
472
|
+
**Gated on the exception, not on the connection's dialect.** *exc* is a
|
|
473
|
+
Postgres driver error iff it carries a SQLSTATE (``psycopg3``'s
|
|
474
|
+
``.sqlstate``, ``psycopg2``'s ``.pgcode`` — the same pair
|
|
475
|
+
:func:`is_lock_contention_error` dispatches on, for the same #2719
|
|
476
|
+
reason: no config flag, no driver import). Keying off that rather than
|
|
477
|
+
``sql.detect_dialect(conn)`` makes "SQLite behaviour is byte-identical
|
|
478
|
+
to before #2983" true *by construction* rather than by argument: a
|
|
479
|
+
``sqlite3.Error`` has no SQLSTATE, so this returns without touching the
|
|
480
|
+
connection and no SQLite caller can lose uncommitted work it expected
|
|
481
|
+
to survive into the next statement (``retry_on_locked``'s multi-
|
|
482
|
+
statement writers being the case where that would actually be
|
|
483
|
+
observable). #2982's sibling fix in ``_migrate_add_columns`` predates
|
|
484
|
+
this helper and rolls back unconditionally; it is correct there (the
|
|
485
|
+
only uncommitted statement at that point is the one that just failed)
|
|
486
|
+
and is deliberately left as-is.
|
|
487
|
+
|
|
488
|
+
A ``None`` *conn* is a no-op — see :func:`_board_connection_if_open`,
|
|
489
|
+
which may legitimately have nothing to hand over. A failure of the
|
|
490
|
+
rollback itself is suppressed: this runs inside an ``except`` block
|
|
491
|
+
whose original exception is the interesting one, and masking it with a
|
|
492
|
+
secondary error from the recovery attempt would be strictly worse than
|
|
493
|
+
leaving the connection unrecovered.
|
|
494
|
+
"""
|
|
495
|
+
if conn is None:
|
|
496
|
+
return
|
|
497
|
+
if getattr(exc, "sqlstate", None) is None and getattr(exc, "pgcode", None) is None:
|
|
498
|
+
return # not a Postgres driver error — nothing was aborted
|
|
499
|
+
try:
|
|
500
|
+
conn.rollback()
|
|
501
|
+
except Exception: # noqa: BLE001 — never mask the caught driver error
|
|
502
|
+
pass
|
|
503
|
+
|
|
504
|
+
|
|
432
505
|
# #2538: a handful of consecutive short retries — long enough to ride out a
|
|
433
506
|
# concurrent writer (the daemon's own passive tick, another `coord merge`/
|
|
434
507
|
# `coord notify` invocation) that only holds the DB for a moment, short
|
|
@@ -517,6 +590,7 @@ def is_lock_contention_error(exc: BaseException) -> bool:
|
|
|
517
590
|
def retry_on_locked(
|
|
518
591
|
write: Callable[[], _T],
|
|
519
592
|
*,
|
|
593
|
+
conn: Any | None = None,
|
|
520
594
|
attempts: int = _LOCK_RETRY_ATTEMPTS,
|
|
521
595
|
base_delay: float = _LOCK_RETRY_BASE_DELAY_S,
|
|
522
596
|
) -> _T:
|
|
@@ -547,12 +621,58 @@ def retry_on_locked(
|
|
|
547
621
|
``coord.state._record_dispatched_assignment_local``, whose caller —
|
|
548
622
|
``coord.auto_loop._dispatch_fix`` — treats it as a declined dispatch
|
|
549
623
|
rather than letting it crash the whole run).
|
|
624
|
+
|
|
625
|
+
Transaction recovery, and whether "retry" means anything on Postgres
|
|
626
|
+
(#2983)
|
|
627
|
+
------------------------------------------------------------------
|
|
628
|
+
SQLite's ``SQLITE_BUSY`` retry model is "the statement never ran; the
|
|
629
|
+
lock is held elsewhere; the transaction is untouched" — so re-running
|
|
630
|
+
*write* verbatim is exactly the right move, and has been since #2538.
|
|
631
|
+
Postgres's three contention SQLSTATEs
|
|
632
|
+
(:data:`_POSTGRES_LOCK_CONTENTION_SQLSTATES`) are contention-shaped in
|
|
633
|
+
the same way, but they ALSO abort the whole transaction. That makes the
|
|
634
|
+
retry loop *worse than useless* on Postgres without recovery: attempt 2
|
|
635
|
+
onwards raises ``InFailedSqlTransaction`` instead of re-attempting the
|
|
636
|
+
write, ``is_lock_contention_error`` reads False for it, and the loop
|
|
637
|
+
bails out on attempt 2 re-raising the wrong error — the #2597/#2689
|
|
638
|
+
retry budget silently reduced to a single attempt.
|
|
639
|
+
|
|
640
|
+
So the answer to "does SQLite's retry model have a Postgres analogue at
|
|
641
|
+
all, or should the retry just be a no-op there?" is: it has one, and it
|
|
642
|
+
is the standard Postgres idiom — **roll back, then re-run the whole
|
|
643
|
+
transaction.** Every *write* callable in this tree is already a
|
|
644
|
+
self-contained transaction (its own statements followed by its own
|
|
645
|
+
``conn.commit()``), which is precisely what makes re-running it after a
|
|
646
|
+
rollback correct rather than a partial replay. Hence
|
|
647
|
+
:func:`rollback_after_driver_error` before both the retry and the final
|
|
648
|
+
re-raise: after the re-raise the connection must still be usable too,
|
|
649
|
+
because ~13 of this tree's callers catch that exception and *swallow*
|
|
650
|
+
it (a cache mirror whose upstream GitHub write already landed must not
|
|
651
|
+
turn into a 503), then keep using the same singleton connection.
|
|
652
|
+
Recovering here rather than in each of those handlers is what keeps the
|
|
653
|
+
guarantee in one place: **when this function returns OR raises, it has
|
|
654
|
+
not left an aborted transaction behind.**
|
|
655
|
+
|
|
656
|
+
*conn* is the connection *write* writes through, needed only for that
|
|
657
|
+
rollback. It defaults to :func:`_board_connection_if_open` because
|
|
658
|
+
every call site in this tree writes through ``get_connection()``
|
|
659
|
+
(``coord.state``, ``coord.merge_queue``, ``coord.audit``,
|
|
660
|
+
``coord.commands.merge``), so the default is correct for all of them
|
|
661
|
+
and none had to be churned; pass it explicitly if you ever write
|
|
662
|
+
through a different connection. Rolling back an innocent already-
|
|
663
|
+
committed connection would be a no-op anyway — every writer here
|
|
664
|
+
commits immediately — and the rollback is skipped entirely unless the
|
|
665
|
+
caught exception carries a Postgres SQLSTATE, so the SQLite path is
|
|
666
|
+
byte-identical to before #2983.
|
|
550
667
|
"""
|
|
551
668
|
delay = base_delay
|
|
552
669
|
for attempt in range(1, attempts + 1):
|
|
553
670
|
try:
|
|
554
671
|
return write()
|
|
555
672
|
except sql.driver_errors() as exc:
|
|
673
|
+
rollback_after_driver_error(
|
|
674
|
+
conn if conn is not None else _board_connection_if_open(), exc
|
|
675
|
+
)
|
|
556
676
|
if not is_lock_contention_error(exc) or attempt >= attempts:
|
|
557
677
|
raise
|
|
558
678
|
time.sleep(delay)
|
|
@@ -619,10 +739,21 @@ def _read_schema_version(conn: sqlite3.Connection) -> int:
|
|
|
619
739
|
the current ``_DB_SCHEMA_VERSION`` and skips the write path entirely —
|
|
620
740
|
until the next bump (#2675: that skip is exactly what silently dropped
|
|
621
741
|
two `_migrate_add_columns` entries when they landed without one).
|
|
742
|
+
|
|
743
|
+
#2983: the "table doesn't exist yet" swallow below needs its own
|
|
744
|
+
rollback — #2982's fix is one layer downstream and does not cover this.
|
|
745
|
+
On a fresh Postgres database this is the FIRST statement `_open_postgres`
|
|
746
|
+
-> `_migrate_if_needed` runs, it errors (`UndefinedTable`), and that
|
|
747
|
+
aborts the transaction; the caller then continues on the same connection
|
|
748
|
+
straight into `_fix_schema_version_table`'s `CREATE TABLE IF NOT
|
|
749
|
+
EXISTS`, which raises `InFailedSqlTransaction`. So on Postgres the
|
|
750
|
+
brand-new-database path — the one case this guard exists for — could
|
|
751
|
+
never get past its own first statement.
|
|
622
752
|
"""
|
|
623
753
|
try:
|
|
624
754
|
row = sql.execute(conn, "SELECT MAX(version) FROM schema_version").fetchone()
|
|
625
|
-
except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
|
|
755
|
+
except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
|
|
756
|
+
rollback_after_driver_error(conn, exc) # #2983: caller keeps using `conn`
|
|
626
757
|
return 0 # table doesn't exist yet
|
|
627
758
|
if row is None or row[0] is None:
|
|
628
759
|
return 0
|
|
@@ -42,7 +42,7 @@ from coord.ci_store import (
|
|
|
42
42
|
summarize,
|
|
43
43
|
summarize_counts,
|
|
44
44
|
)
|
|
45
|
-
from coord.db import get_connection, retry_on_locked
|
|
45
|
+
from coord.db import get_connection, retry_on_locked, rollback_after_driver_error
|
|
46
46
|
from coord.forge_availability import MERGE_GATE_REFUSAL_KINDS, record_merge_gate_refusal
|
|
47
47
|
from coord.models import (
|
|
48
48
|
CLOSES_ISSUE_TYPES,
|
|
@@ -3812,11 +3812,23 @@ def _archived_merged_issue_keys(conn: sqlite3.Connection) -> set[tuple[str, int]
|
|
|
3812
3812
|
"SELECT repo_name, issue_number FROM merge_queue_archive WHERE state = ?",
|
|
3813
3813
|
(MERGED,),
|
|
3814
3814
|
).fetchall()
|
|
3815
|
-
except sql.driver_errors(): # #2784: not just sqlite3.OperationalError
|
|
3815
|
+
except sql.driver_errors() as exc: # #2784: not just sqlite3.OperationalError
|
|
3816
3816
|
# "no such table" surfaces as a *different* driver-named exception
|
|
3817
3817
|
# per backend (sqlite3.OperationalError vs psycopg.errors.
|
|
3818
3818
|
# UndefinedTable), so this must go through the dialect seam or the
|
|
3819
3819
|
# not-yet-archived case becomes an uncaught crash on Postgres.
|
|
3820
|
+
#
|
|
3821
|
+
# #2983: and catching it is only half the job. `conn` here is the
|
|
3822
|
+
# process-lived `get_connection()` singleton, which the caller
|
|
3823
|
+
# (`merged_issue_keys`, and in turn `enqueue_approved_work` /
|
|
3824
|
+
# `staging_items`) keeps writing and reading through long after this
|
|
3825
|
+
# returns — on Postgres the swallowed UndefinedTable aborts that
|
|
3826
|
+
# connection's transaction, so the "archive doesn't exist yet"
|
|
3827
|
+
# degrade turned every subsequent statement into
|
|
3828
|
+
# InFailedSqlTransaction. Nothing uncommitted is at risk: this
|
|
3829
|
+
# function only reads, and on Postgres the abort had already
|
|
3830
|
+
# discarded anything pending regardless.
|
|
3831
|
+
rollback_after_driver_error(conn, exc)
|
|
3820
3832
|
return set()
|
|
3821
3833
|
return {(r["repo_name"], r["issue_number"]) for r in rows}
|
|
3822
3834
|
|
|
@@ -46,7 +46,12 @@ from coord.board_service import route_assignment_patch as _route_assignment_patc
|
|
|
46
46
|
from coord.board_service import route_issue_comment as _route_issue_comment
|
|
47
47
|
from coord.board_service import route_issue_patch as _route_issue_patch
|
|
48
48
|
from coord.board_service import route_write as _route_write
|
|
49
|
-
from coord.db import
|
|
49
|
+
from coord.db import (
|
|
50
|
+
get_connection,
|
|
51
|
+
is_lock_contention_error,
|
|
52
|
+
retry_on_locked,
|
|
53
|
+
rollback_after_driver_error,
|
|
54
|
+
)
|
|
50
55
|
from coord.models import (
|
|
51
56
|
WORK_LIKE_TYPES,
|
|
52
57
|
Assignment,
|
|
@@ -3137,6 +3142,13 @@ def _update_assignment_tokens_local(
|
|
|
3137
3142
|
# and now also covers a lock that outlasts the retry budget.
|
|
3138
3143
|
retry_on_locked(_write)
|
|
3139
3144
|
except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
|
|
3145
|
+
# #2983 audit: safe to swallow without a rollback here, unlike the
|
|
3146
|
+
# sibling handlers below — `retry_on_locked` guarantees it has not
|
|
3147
|
+
# left an aborted transaction behind when it returns OR raises (see
|
|
3148
|
+
# its "Transaction recovery" docstring section), so every handler
|
|
3149
|
+
# whose `try` body is a `retry_on_locked(...)` call inherits the fix
|
|
3150
|
+
# for free. Adding a second rollback here would be redundant, not
|
|
3151
|
+
# safer.
|
|
3140
3152
|
pass
|
|
3141
3153
|
|
|
3142
3154
|
|
|
@@ -3184,9 +3196,17 @@ def _update_assignment_stop_reason_local(assignment_id: str, stop_reason: str) -
|
|
|
3184
3196
|
(stop_reason, assignment_id),
|
|
3185
3197
|
)
|
|
3186
3198
|
conn.commit()
|
|
3187
|
-
except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
|
|
3199
|
+
except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
|
|
3188
3200
|
# Column may not exist yet (pre-migration DB or test fixtures).
|
|
3189
|
-
|
|
3201
|
+
#
|
|
3202
|
+
# #2983: `conn` is the process-/thread-lived `get_connection()`
|
|
3203
|
+
# singleton, so on Postgres swallowing this without a rollback
|
|
3204
|
+
# leaves the transaction aborted for every LATER caller of
|
|
3205
|
+
# `get_connection()` in this process, not just for the rest of this
|
|
3206
|
+
# function. Nothing uncommitted is lost: the only statement in the
|
|
3207
|
+
# transaction is the UPDATE that just failed (the `commit()` above
|
|
3208
|
+
# is the last thing in the block).
|
|
3209
|
+
rollback_after_driver_error(conn, exc)
|
|
3190
3210
|
|
|
3191
3211
|
|
|
3192
3212
|
def mark_assignment_interactive(assignment_id: str) -> None:
|
|
@@ -3221,9 +3241,12 @@ def _mark_assignment_interactive_local(assignment_id: str) -> None:
|
|
|
3221
3241
|
(assignment_id,),
|
|
3222
3242
|
)
|
|
3223
3243
|
conn.commit()
|
|
3224
|
-
except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
|
|
3244
|
+
except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
|
|
3225
3245
|
# Column may not exist on a pre-migration DB.
|
|
3226
|
-
|
|
3246
|
+
# #2983: same shared-singleton reasoning as
|
|
3247
|
+
# `_update_assignment_stop_reason_local` above — swallow, but leave
|
|
3248
|
+
# the connection usable for the next `get_connection()` caller.
|
|
3249
|
+
rollback_after_driver_error(conn, exc)
|
|
3227
3250
|
|
|
3228
3251
|
|
|
3229
3252
|
def set_test_plan(
|
|
@@ -3392,8 +3415,14 @@ def _set_assignment_failure_reason_local(assignment_id: str, reason: str) -> Non
|
|
|
3392
3415
|
(reason[:512], now, assignment_id), # cap at 512 chars — one-liner
|
|
3393
3416
|
)
|
|
3394
3417
|
conn.commit()
|
|
3395
|
-
except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
|
|
3418
|
+
except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
|
|
3396
3419
|
# Column may not exist on a pre-migration DB — best-effort.
|
|
3420
|
+
# #2983: the `return` ends this function but NOT the connection's
|
|
3421
|
+
# life — it is the shared `get_connection()` singleton, so an
|
|
3422
|
+
# un-rolled-back abort here would take out every later statement in
|
|
3423
|
+
# the process on Postgres (including this same daemon request's
|
|
3424
|
+
# audit write below).
|
|
3425
|
+
rollback_after_driver_error(conn, exc)
|
|
3397
3426
|
return
|
|
3398
3427
|
# #1036 fix review finding 2: no matching row (bad/stale assignment_id)
|
|
3399
3428
|
# means the UPDATE above touched nothing — don't audit a transition that
|
|
@@ -5982,7 +6011,15 @@ def _list_issue_numbers_with_assignments_local(repo_name: str) -> set[int]:
|
|
|
5982
6011
|
f"SELECT DISTINCT issue_number FROM {table} WHERE repo_name = ?", # noqa: S608
|
|
5983
6012
|
(repo_name,),
|
|
5984
6013
|
).fetchall()
|
|
5985
|
-
except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
|
|
6014
|
+
except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
|
|
6015
|
+
# #2983: `continue` goes straight back round the loop on the SAME
|
|
6016
|
+
# connection, so on Postgres a missing `assignments_archive` (the
|
|
6017
|
+
# exact case named below) aborted the transaction and the NEXT
|
|
6018
|
+
# iteration — plus everything else this process later ran through
|
|
6019
|
+
# `get_connection()` — raised InFailedSqlTransaction uncaught.
|
|
6020
|
+
# Read-only loop, so the rollback can only discard the SELECT
|
|
6021
|
+
# that just failed.
|
|
6022
|
+
rollback_after_driver_error(conn, exc)
|
|
5986
6023
|
continue # assignments_archive may not exist yet (housekeeping never ran)
|
|
5987
6024
|
numbers.update(r[0] for r in rows if r[0] is not None)
|
|
5988
6025
|
return numbers
|
|
@@ -3309,6 +3309,73 @@ def test_fetch_live_blocked_gate_unreadable_causes_all_log_at_warning(
|
|
|
3309
3309
|
assert all(rec.levelname == "WARNING" for rec in sweep_records), caplog.text
|
|
3310
3310
|
|
|
3311
3311
|
|
|
3312
|
+
# ── #3012: an acceptance-slice's merge row is keyed to the EPIC, not the ────
|
|
3313
|
+
# slice — the blocked-gate sweep must resolve it via `for_issue_number`
|
|
3314
|
+
#
|
|
3315
|
+
# coord-portal#164, 2026-08-31: the merge_queue row for an oracle-loop
|
|
3316
|
+
# acceptance slice is keyed on `issue_number` = the milestone/epic issue
|
|
3317
|
+
# (`merge_queue.enqueue`/`refresh_entry_assignment` set it straight from
|
|
3318
|
+
# `assignment.issue_number`), never the slice's own issue. The drive-queue
|
|
3319
|
+
# entry for the slice is keyed on the SLICE issue, so `queue_by_key.get(e.key)`
|
|
3320
|
+
# always missed it — reported "no merge-queue row for this entry" (reads as
|
|
3321
|
+
# "retry might help") even though the row existed and was sitting in a
|
|
3322
|
+
# genuinely terminal state (`human_required`) that no retry could ever clear.
|
|
3323
|
+
# `coord gates` already resolves this via `effective_issue_number` (the
|
|
3324
|
+
# `for_issue_number` on the underlying assignment); the sweep must too.
|
|
3325
|
+
|
|
3326
|
+
|
|
3327
|
+
def test_fetch_live_blocked_gate_finds_an_acceptance_slices_row_keyed_to_the_epic(
|
|
3328
|
+
monkeypatch, coord_db,
|
|
3329
|
+
):
|
|
3330
|
+
"""A merge-queue row booked to the epic (#160) but FOR the slice (#164,
|
|
3331
|
+
via the assignment's `for_issue_number`) must be found when probing the
|
|
3332
|
+
slice's own blocked drive-queue entry — not reported unreadable."""
|
|
3333
|
+
import types
|
|
3334
|
+
|
|
3335
|
+
import coord.board_service as board_service
|
|
3336
|
+
import coord.ci_store as ci_store_mod
|
|
3337
|
+
import coord.commands._common as common
|
|
3338
|
+
import coord.merge_queue as mq
|
|
3339
|
+
import coord.state as state_mod
|
|
3340
|
+
from coord.commands.drive_queue import _fetch_live_blocked_gate
|
|
3341
|
+
from coord.drive_queue import STATE_BLOCKED, QueueEntry, entry_key
|
|
3342
|
+
|
|
3343
|
+
entry = QueueEntry(
|
|
3344
|
+
repo=REPO, issue=164, position=1, state=STATE_BLOCKED,
|
|
3345
|
+
last_reason="drive session died without landing the work, launched "
|
|
3346
|
+
"90s ago (attempt 2/2) — giving up",
|
|
3347
|
+
)
|
|
3348
|
+
|
|
3349
|
+
# The merge-queue row: booked to the epic (#160), same as coord-portal#164
|
|
3350
|
+
# actually recorded it.
|
|
3351
|
+
row = types.SimpleNamespace(
|
|
3352
|
+
repo_name=REPO, issue_number=160, pr_number=42, assignment_id="a3ab4b929",
|
|
3353
|
+
)
|
|
3354
|
+
# The board assignment behind that row: booked to #160, but FOR #164.
|
|
3355
|
+
slice_assignment = types.SimpleNamespace(
|
|
3356
|
+
assignment_id="a3ab4b929", issue_number=160, for_issue_number=164,
|
|
3357
|
+
)
|
|
3358
|
+
fake_board = types.SimpleNamespace(active=[], completed=[slice_assignment])
|
|
3359
|
+
|
|
3360
|
+
def fake_entry_gate_status(q, board, cfg, ci_store, gh_ops):
|
|
3361
|
+
assert q is row # the epic-keyed row, resolved via for_issue_number
|
|
3362
|
+
return mq.PLAN_BLOCKED, "checks failed: e2e smoke (playwright) (failure)"
|
|
3363
|
+
|
|
3364
|
+
monkeypatch.setattr(mq, "load_queue", lambda: [row])
|
|
3365
|
+
monkeypatch.setattr(mq, "entry_gate_status", fake_entry_gate_status)
|
|
3366
|
+
monkeypatch.setattr(board_service, "resolve", lambda: None)
|
|
3367
|
+
monkeypatch.setattr(common, "_load_config", lambda path: _fake_cfg())
|
|
3368
|
+
monkeypatch.setattr(state_mod, "load_board", lambda: fake_board)
|
|
3369
|
+
monkeypatch.setattr(ci_store_mod, "build_ci_store", lambda *a, **k: object())
|
|
3370
|
+
|
|
3371
|
+
overrides, unreadable = _fetch_live_blocked_gate([entry], None)
|
|
3372
|
+
|
|
3373
|
+
# Found and read — NOT "could not be read". The gate is confirmed still
|
|
3374
|
+
# shut (still blocked), which is the true, reportable state.
|
|
3375
|
+
assert unreadable == {}
|
|
3376
|
+
assert overrides == {entry_key(REPO, 164): True}
|
|
3377
|
+
|
|
3378
|
+
|
|
3312
3379
|
# ── tick: the cross-host guard (#1870) ───────────────────────────────────────
|
|
3313
3380
|
#
|
|
3314
3381
|
# 2026-08-06: a drive launched by hand on `elitebook` was 47 minutes into a
|
|
@@ -21,6 +21,12 @@ from coord import db as db_mod
|
|
|
21
21
|
from coord import sql
|
|
22
22
|
from coord.dao import CoordStore, SqliteStore
|
|
23
23
|
from coord.db import _ensure_schema
|
|
24
|
+
from tests import backends
|
|
25
|
+
from tests.test_db import (
|
|
26
|
+
AbortOnErrorConn,
|
|
27
|
+
abort_simulating_connection,
|
|
28
|
+
schema_migrated_sqlite_connection,
|
|
29
|
+
)
|
|
24
30
|
|
|
25
31
|
|
|
26
32
|
@pytest.fixture
|
|
@@ -262,3 +268,79 @@ class TestConnectDialectRouting:
|
|
|
262
268
|
store = SqliteStore(read_db)
|
|
263
269
|
with pytest.raises(db_mod.ProductionDatabaseGuardError):
|
|
264
270
|
store._connect()
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
# ── #2983: a swallowed driver error must not poison the read connection ─────
|
|
274
|
+
#
|
|
275
|
+
# `_audit_recent_count` is documented as failing "open to 0 so a
|
|
276
|
+
# missing/pre-migration table never 503s the board". On Postgres a failed
|
|
277
|
+
# statement aborts the whole transaction, so before #2983 the swallow took
|
|
278
|
+
# out every *sibling* read sharing that `with closing(self._connect())`
|
|
279
|
+
# block -- `escalations` and `drive_queue` are evaluated after it in
|
|
280
|
+
# `board_projection`'s dict literal -- producing precisely the 503 the guard
|
|
281
|
+
# exists to prevent.
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
class TestAuditRecentCountRollsBackOnDriverError:
|
|
285
|
+
"""Drives the regression with the shared abort-simulating stub, so it is
|
|
286
|
+
meaningful on a SQLite-only dev machine with no Postgres server."""
|
|
287
|
+
|
|
288
|
+
def _store_with_missing_audit_log(
|
|
289
|
+
self, monkeypatch: pytest.MonkeyPatch
|
|
290
|
+
) -> tuple[SqliteStore, AbortOnErrorConn]:
|
|
291
|
+
conn = abort_simulating_connection(
|
|
292
|
+
monkeypatch, schema_migrated_sqlite_connection(drop=("audit_log",))
|
|
293
|
+
)
|
|
294
|
+
monkeypatch.setattr(SqliteStore, "_connect", lambda self: conn)
|
|
295
|
+
return SqliteStore(Path("unused-the-connection-is-injected.db")), conn
|
|
296
|
+
|
|
297
|
+
def test_returns_zero_and_leaves_the_connection_usable(
|
|
298
|
+
self, monkeypatch: pytest.MonkeyPatch
|
|
299
|
+
) -> None:
|
|
300
|
+
store, conn = self._store_with_missing_audit_log(monkeypatch)
|
|
301
|
+
|
|
302
|
+
assert store._audit_recent_count(conn) == 0
|
|
303
|
+
assert conn.rollbacks == 1
|
|
304
|
+
# The "further operation on the same connection" acceptance
|
|
305
|
+
# criterion -- pre-fix this raises "current transaction is aborted".
|
|
306
|
+
assert sql.execute(conn, "SELECT 1 AS ok").fetchone()["ok"] == 1
|
|
307
|
+
|
|
308
|
+
def test_board_projection_still_serves_the_reads_after_the_swallow(
|
|
309
|
+
self, monkeypatch: pytest.MonkeyPatch
|
|
310
|
+
) -> None:
|
|
311
|
+
"""The user-visible shape: a missing `audit_log` must degrade to
|
|
312
|
+
`audit_recent_count: 0`, not 503 the whole board. `escalations` and
|
|
313
|
+
`drive_queue` are read *after* `_audit_recent_count` in
|
|
314
|
+
`board_projection`'s dict literal, so they are what actually broke."""
|
|
315
|
+
store, conn = self._store_with_missing_audit_log(monkeypatch)
|
|
316
|
+
|
|
317
|
+
payload = store.board_projection()
|
|
318
|
+
|
|
319
|
+
assert payload["audit_recent_count"] == 0
|
|
320
|
+
assert payload["escalations"] == []
|
|
321
|
+
assert payload["drive_queue"] == []
|
|
322
|
+
assert payload["assignments"] == []
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class TestAuditRecentCountRollsBackOnRealPostgres:
|
|
326
|
+
"""The same regression against an actual Postgres server, when one is
|
|
327
|
+
reachable -- `psycopg.errors.UndefinedTable` followed by
|
|
328
|
+
`InFailedSqlTransaction`, the real shapes the stub above simulates."""
|
|
329
|
+
|
|
330
|
+
def test_sibling_reads_survive_a_missing_audit_log(self) -> None:
|
|
331
|
+
unavailable = backends.postgres_available()
|
|
332
|
+
if unavailable:
|
|
333
|
+
pytest.skip(f"no Postgres backend available: {unavailable}")
|
|
334
|
+
|
|
335
|
+
session = backends.open_named_session(backends.BACKEND_POSTGRES)
|
|
336
|
+
try:
|
|
337
|
+
_ensure_schema(session.conn)
|
|
338
|
+
sql.execute(session.conn, "DROP TABLE audit_log")
|
|
339
|
+
session.conn.commit()
|
|
340
|
+
store = SqliteStore(Path("unused-the-connection-is-injected.db"))
|
|
341
|
+
|
|
342
|
+
assert store._audit_recent_count(session.conn) == 0
|
|
343
|
+
# Pre-fix: psycopg.errors.InFailedSqlTransaction.
|
|
344
|
+
assert sql.execute(session.conn, "SELECT 1 AS ok").fetchone()["ok"] == 1
|
|
345
|
+
finally:
|
|
346
|
+
session.close()
|