code-coordinator 0.5.272__tar.gz → 0.5.274__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.272 → code_coordinator-0.5.274}/.github/workflows/test.yml +58 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/PKG-INFO +3 -1
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/code_coordinator.egg-info/PKG-INFO +3 -1
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/code_coordinator.egg-info/SOURCES.txt +5 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/code_coordinator.egg-info/requires.txt +3 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/code_coordinator.egg-info/scm_file_list.json +5 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/cli.py +2 -0
- code_coordinator-0.5.274/coord/commands/store_migrate.py +105 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/db.py +14 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/sql.py +245 -18
- code_coordinator-0.5.274/coord/store_migrate.py +540 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/pyproject.toml +11 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/backends.py +54 -16
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_sql_dialect.py +361 -17
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_sqlite_connect_ratchet.py +25 -4
- code_coordinator-0.5.274/tests/test_store_migrate.py +580 -0
- code_coordinator-0.5.274/tests/test_write_parity.py +586 -0
- code_coordinator-0.5.274/tests/write_parity.py +1206 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/.gitignore +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/CLAUDE.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/GOAL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/LICENSE +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/MANIFEST.in +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/README.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/__init__.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/agent.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/audit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/block_log.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/board_service.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/brain.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/claim.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/client.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/comments.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/config.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/dao.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/deps.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/drive.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/events.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/filelock.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/freshness.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/gates.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/goal.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/context.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/models.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/render.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/health/units.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/hooks.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/interactive.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/models.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/network.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/notify.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/openapi.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/parentage.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/plans.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/progress.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/release_window.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/reports.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/review.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/self_health.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/smoke.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/split_work.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/state.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/test_author.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/test_report.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/usage.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/install-agent.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/setup.cfg +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/__init__.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/conftest.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_config.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_db.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_events.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_init.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_models.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_network.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_review.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_session.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_split.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_state.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/types/generated.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.272 → code_coordinator-0.5.274}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -320,3 +320,61 @@ jobs:
|
|
|
320
320
|
# the half of that check this repo can still make (the generator runs and
|
|
321
321
|
# covers every schema; the coord-web byte-comparison itself is that repo's
|
|
322
322
|
# own CI, per the paragraph above).
|
|
323
|
+
|
|
324
|
+
# #2886: a real Postgres 16 service, so `coord/sql.py`'s Postgres branches
|
|
325
|
+
# (paramstyle translation, upsert idioms, `information_schema`
|
|
326
|
+
# introspection, `RETURNING`, `dict_row`) — spoken since #2719 but never
|
|
327
|
+
# once executed against a real server — actually run against one, and so
|
|
328
|
+
# `COORD_TEST_BACKEND=postgres` (#2884's test-suite backend switch) means
|
|
329
|
+
# something in CI for the first time.
|
|
330
|
+
#
|
|
331
|
+
# SEPARATE JOB, not a `services:` block bolted onto `test` above, for two
|
|
332
|
+
# reasons: (1) the SQLite lane must stay exactly as fast and exactly as
|
|
333
|
+
# reliable as it is today — a Postgres service, even an unused one, is
|
|
334
|
+
# more CI surface for that job to depend on for zero benefit to the
|
|
335
|
+
# SQLite path; (2) `continue-on-error: true` below softens THIS job's
|
|
336
|
+
# conclusion without touching `test`'s at all. Running the whole suite
|
|
337
|
+
# (`coord_db` is autouse — see tests/conftest.py — so every one of ~400
|
|
338
|
+
# test files follows `COORD_TEST_BACKEND` for free) against a backend
|
|
339
|
+
# nothing has ever run it against is expected to be red for real,
|
|
340
|
+
# unrelated-to-this-PR reasons at first (coord/db.py's `_ensure_schema`
|
|
341
|
+
# and friends were written and only ever exercised against SQLite) — the
|
|
342
|
+
# harness-portability issue's deliverable is exactly that failure list.
|
|
343
|
+
# `continue-on-error: true` keeps this job's signal visible (its own
|
|
344
|
+
# conclusion is still pass/fail on the Checks tab) without blocking merges
|
|
345
|
+
# on it. Flip it off once that failure list is closed out.
|
|
346
|
+
#
|
|
347
|
+
# `psycopg` is an optional extra (`postgres`, this issue) — never a base
|
|
348
|
+
# or `[dev]` dependency (see `pyproject.toml`) — so installing it is this
|
|
349
|
+
# job's own opt-in `pip install -e ".[dev,postgres]"`, not a change to
|
|
350
|
+
# what every other job's `pip install -e ".[dev]"` pulls in.
|
|
351
|
+
postgres:
|
|
352
|
+
runs-on: ubuntu-latest
|
|
353
|
+
continue-on-error: true
|
|
354
|
+
services:
|
|
355
|
+
postgres:
|
|
356
|
+
image: postgres:16
|
|
357
|
+
env:
|
|
358
|
+
POSTGRES_PASSWORD: postgres
|
|
359
|
+
options: >-
|
|
360
|
+
--health-cmd pg_isready --health-interval 10s
|
|
361
|
+
--health-timeout 5s --health-retries 5
|
|
362
|
+
ports:
|
|
363
|
+
- 5432:5432
|
|
364
|
+
env:
|
|
365
|
+
COORD_TEST_BACKEND: postgres
|
|
366
|
+
# The default image's bootstrap database is named after POSTGRES_USER
|
|
367
|
+
# (postgres) since no POSTGRES_DB was set above — matches
|
|
368
|
+
# tests/backends.py's schema-per-test isolation, which needs CREATE on
|
|
369
|
+
# an existing database, not a database of its own.
|
|
370
|
+
COORD_TEST_POSTGRES_DSN: postgresql://postgres:postgres@localhost:5432/postgres
|
|
371
|
+
steps:
|
|
372
|
+
- uses: actions/checkout@v4
|
|
373
|
+
- uses: actions/setup-python@v5
|
|
374
|
+
with:
|
|
375
|
+
python-version: "3.12"
|
|
376
|
+
- run: pip install -e ".[dev,postgres]"
|
|
377
|
+
# #2180: same split as the `test` job above — the sealed acceptance
|
|
378
|
+
# suite is gated separately through the #2164 CI wrapper, not swept
|
|
379
|
+
# into this job's ordinary pytest run.
|
|
380
|
+
- run: pytest --ignore=tests/acceptance
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-coordinator
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.274
|
|
4
4
|
Summary: Coordinate Claude Code workers across multiple machines and repos.
|
|
5
5
|
Author-email: John Donaghy <johnfdonaghy@gmail.com>
|
|
6
6
|
License-Expression: LicenseRef-FSL-1.1-MIT
|
|
@@ -26,6 +26,8 @@ Requires-Dist: starlette>=0.37; extra == "server"
|
|
|
26
26
|
Requires-Dist: uvicorn>=0.30; extra == "server"
|
|
27
27
|
Requires-Dist: websockets>=12.0; extra == "server"
|
|
28
28
|
Requires-Dist: psutil>=5.9; extra == "server"
|
|
29
|
+
Provides-Extra: postgres
|
|
30
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "postgres"
|
|
29
31
|
Provides-Extra: all
|
|
30
32
|
Requires-Dist: code-coordinator[server]; extra == "all"
|
|
31
33
|
Provides-Extra: dev
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-coordinator
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.274
|
|
4
4
|
Summary: Coordinate Claude Code workers across multiple machines and repos.
|
|
5
5
|
Author-email: John Donaghy <johnfdonaghy@gmail.com>
|
|
6
6
|
License-Expression: LicenseRef-FSL-1.1-MIT
|
|
@@ -26,6 +26,8 @@ Requires-Dist: starlette>=0.37; extra == "server"
|
|
|
26
26
|
Requires-Dist: uvicorn>=0.30; extra == "server"
|
|
27
27
|
Requires-Dist: websockets>=12.0; extra == "server"
|
|
28
28
|
Requires-Dist: psutil>=5.9; extra == "server"
|
|
29
|
+
Provides-Extra: postgres
|
|
30
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "postgres"
|
|
29
31
|
Provides-Extra: all
|
|
30
32
|
Requires-Dist: code-coordinator[server]; extra == "all"
|
|
31
33
|
Provides-Extra: dev
|
|
@@ -141,6 +141,7 @@ coord/split_work.py
|
|
|
141
141
|
coord/sql.py
|
|
142
142
|
coord/stage_projection.py
|
|
143
143
|
coord/state.py
|
|
144
|
+
coord/store_migrate.py
|
|
144
145
|
coord/test_author.py
|
|
145
146
|
coord/test_chat.py
|
|
146
147
|
coord/test_orchestrator.py
|
|
@@ -181,6 +182,7 @@ coord/commands/scorecard.py
|
|
|
181
182
|
coord/commands/sessions.py
|
|
182
183
|
coord/commands/setup.py
|
|
183
184
|
coord/commands/status.py
|
|
185
|
+
coord/commands/store_migrate.py
|
|
184
186
|
coord/commands/terminal.py
|
|
185
187
|
coord/commands/test_gate.py
|
|
186
188
|
coord/commands/tui.py
|
|
@@ -724,6 +726,7 @@ tests/test_state_review_findings_daemon.py
|
|
|
724
726
|
tests/test_status_fleet_footer.py
|
|
725
727
|
tests/test_stop_1567.py
|
|
726
728
|
tests/test_store_contract.py
|
|
729
|
+
tests/test_store_migrate.py
|
|
727
730
|
tests/test_stuck.py
|
|
728
731
|
tests/test_stuck_test_state_watchdog_2803.py
|
|
729
732
|
tests/test_terminal_command.py
|
|
@@ -754,6 +757,8 @@ tests/test_worker_safety.py
|
|
|
754
757
|
tests/test_worker_test_scoping.py
|
|
755
758
|
tests/test_worktree.py
|
|
756
759
|
tests/test_worktree_rmtree_chokepoint.py
|
|
760
|
+
tests/test_write_parity.py
|
|
761
|
+
tests/write_parity.py
|
|
757
762
|
tests/acceptance/ms-33/audit_1039.rs
|
|
758
763
|
tests/acceptance/ms-33/contract.md
|
|
759
764
|
tests/acceptance/ms-33/manifest.yml
|
{code_coordinator-0.5.272 → code_coordinator-0.5.274}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -77,6 +77,7 @@
|
|
|
77
77
|
"coord/commands/sessions.py",
|
|
78
78
|
"coord/commands/setup.py",
|
|
79
79
|
"coord/commands/status.py",
|
|
80
|
+
"coord/commands/store_migrate.py",
|
|
80
81
|
"coord/commands/terminal.py",
|
|
81
82
|
"coord/commands/test_gate.py",
|
|
82
83
|
"coord/commands/tui.py",
|
|
@@ -251,6 +252,7 @@
|
|
|
251
252
|
"coord/sql.py",
|
|
252
253
|
"coord/stage_projection.py",
|
|
253
254
|
"coord/state.py",
|
|
255
|
+
"coord/store_migrate.py",
|
|
254
256
|
"coord/test_author.py",
|
|
255
257
|
"coord/test_chat.py",
|
|
256
258
|
"coord/test_orchestrator.py",
|
|
@@ -796,6 +798,7 @@
|
|
|
796
798
|
"tests/test_status_fleet_footer.py",
|
|
797
799
|
"tests/test_stop_1567.py",
|
|
798
800
|
"tests/test_store_contract.py",
|
|
801
|
+
"tests/test_store_migrate.py",
|
|
799
802
|
"tests/test_stuck.py",
|
|
800
803
|
"tests/test_stuck_test_state_watchdog_2803.py",
|
|
801
804
|
"tests/test_terminal_command.py",
|
|
@@ -826,6 +829,8 @@
|
|
|
826
829
|
"tests/test_worker_test_scoping.py",
|
|
827
830
|
"tests/test_worktree.py",
|
|
828
831
|
"tests/test_worktree_rmtree_chokepoint.py",
|
|
832
|
+
"tests/test_write_parity.py",
|
|
833
|
+
"tests/write_parity.py",
|
|
829
834
|
"tui/Cargo.lock",
|
|
830
835
|
"tui/Cargo.toml",
|
|
831
836
|
"tui/cargo-config-local-quadraui.toml.example",
|
|
@@ -147,6 +147,7 @@ from coord.commands.release import release_group, release_preflight
|
|
|
147
147
|
# #2220: `coord repo add` / `coord repo doctor` — onboarding a repo, and
|
|
148
148
|
# verifying it actually happened across all five layers.
|
|
149
149
|
from coord.commands.repo import repo_group
|
|
150
|
+
from coord.commands.store_migrate import migrate_to_postgres
|
|
150
151
|
from coord.commands.plan_followup import (
|
|
151
152
|
_dispatch_followup, # noqa: F401 — re-exported for tests
|
|
152
153
|
approve_plan,
|
|
@@ -491,6 +492,7 @@ main.add_command(release_preflight)
|
|
|
491
492
|
main.add_command(release_group)
|
|
492
493
|
# #2220: repo onboarding + its verifier.
|
|
493
494
|
main.add_command(repo_group)
|
|
495
|
+
main.add_command(migrate_to_postgres)
|
|
494
496
|
main.add_command(tui_group)
|
|
495
497
|
|
|
496
498
|
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""``coord migrate-to-postgres`` -- one-shot import of an existing SQLite
|
|
2
|
+
``coord.db`` into the Postgres store #827's ``store:`` config seam names
|
|
3
|
+
(#828 second half). See ``coord.store_migrate`` for the actual audit/copy
|
|
4
|
+
logic this command is a thin CLI wrapper around.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
import click
|
|
12
|
+
|
|
13
|
+
from coord import db as coord_db
|
|
14
|
+
from coord import sql
|
|
15
|
+
from coord.store_migrate import ImportAborted, run_import
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@click.command(
|
|
19
|
+
"migrate-to-postgres",
|
|
20
|
+
help=(
|
|
21
|
+
"Import an existing SQLite coord.db into the Postgres store configured "
|
|
22
|
+
"by coordinator.yml's store: block (#828). Audits referential integrity "
|
|
23
|
+
"and type-affinity drift before writing anything."
|
|
24
|
+
),
|
|
25
|
+
)
|
|
26
|
+
@click.option(
|
|
27
|
+
"--source",
|
|
28
|
+
"source_path",
|
|
29
|
+
type=click.Path(path_type=Path),
|
|
30
|
+
default=None,
|
|
31
|
+
help="Path to the source coord.db (default: this install's DB_PATH).",
|
|
32
|
+
)
|
|
33
|
+
@click.option(
|
|
34
|
+
"--dsn",
|
|
35
|
+
default=None,
|
|
36
|
+
help="Target Postgres DSN (default: coordinator.yml's store.dsn).",
|
|
37
|
+
)
|
|
38
|
+
@click.option(
|
|
39
|
+
"--force",
|
|
40
|
+
is_flag=True,
|
|
41
|
+
help="Wipe and re-import any target tables that already have rows (default: refuse).",
|
|
42
|
+
)
|
|
43
|
+
@click.option(
|
|
44
|
+
"--dry-run",
|
|
45
|
+
is_flag=True,
|
|
46
|
+
help="Audit the source and report row counts without opening or writing the target.",
|
|
47
|
+
)
|
|
48
|
+
def migrate_to_postgres(
|
|
49
|
+
source_path: Path | None, dsn: str | None, force: bool, dry_run: bool
|
|
50
|
+
) -> None:
|
|
51
|
+
source_path = source_path or coord_db.DB_PATH
|
|
52
|
+
if dsn is None and not dry_run:
|
|
53
|
+
target = coord_db._resolve_store_target()
|
|
54
|
+
if not target.dsn:
|
|
55
|
+
raise click.ClickException(
|
|
56
|
+
"no --dsn given and coordinator.yml has no store.dsn configured -- "
|
|
57
|
+
"pass --dsn explicitly, or set store.backend: postgres / store.dsn "
|
|
58
|
+
"in coordinator.yml first (#827)."
|
|
59
|
+
)
|
|
60
|
+
dsn = target.dsn
|
|
61
|
+
|
|
62
|
+
click.echo(f"Source: {source_path}")
|
|
63
|
+
# Never echo the raw DSN -- it routinely embeds a password
|
|
64
|
+
# (`store.dsn`'s plain-string shape, coord/config.py), and this command's
|
|
65
|
+
# stdout is exactly the kind of text that can end up in a log or a
|
|
66
|
+
# GitHub comment (coord.db._migrate_if_needed's docstring states the
|
|
67
|
+
# policy this follows). sql.redact_dsn() prints host/dbname only.
|
|
68
|
+
target_line = sql.redact_dsn(dsn) if dsn else "(dry-run -- target is never opened)"
|
|
69
|
+
click.echo(f"Target: {target_line}")
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
report = run_import(sqlite_path=source_path, dsn=dsn or "", force=force, dry_run=dry_run)
|
|
73
|
+
except ImportAborted as exc:
|
|
74
|
+
raise click.ClickException(str(exc)) from exc
|
|
75
|
+
|
|
76
|
+
click.echo()
|
|
77
|
+
if report.dry_run:
|
|
78
|
+
# The target is never opened for a dry run, so TableReport.target_rows
|
|
79
|
+
# is a placeholder 0 -- printing a source/target/status table here
|
|
80
|
+
# would read every table as a false "MISMATCH". Report source counts
|
|
81
|
+
# only; the audits (referential integrity, type affinity) already ran
|
|
82
|
+
# and would have raised ImportAborted above if either found anything.
|
|
83
|
+
click.echo(f"{'table':<30} {'source rows':>12}")
|
|
84
|
+
for t in report.tables:
|
|
85
|
+
click.echo(f"{t.table:<30} {t.source_rows:>12}")
|
|
86
|
+
click.echo(
|
|
87
|
+
"\nAudits passed (referential integrity, type affinity). "
|
|
88
|
+
"Dry run -- no target opened, no rows written."
|
|
89
|
+
)
|
|
90
|
+
return
|
|
91
|
+
|
|
92
|
+
click.echo(f"{'table':<30} {'source':>10} {'target':>10} status")
|
|
93
|
+
all_ok = True
|
|
94
|
+
for t in report.tables:
|
|
95
|
+
status = "OK" if t.ok else "MISMATCH"
|
|
96
|
+
if not t.ok:
|
|
97
|
+
all_ok = False
|
|
98
|
+
click.echo(f"{t.table:<30} {t.source_rows:>10} {t.target_rows:>10} {status}")
|
|
99
|
+
|
|
100
|
+
if not all_ok:
|
|
101
|
+
raise click.ClickException(
|
|
102
|
+
"row-count parity mismatch after import -- see table above; the target "
|
|
103
|
+
"was written but does not match the source row-for-row"
|
|
104
|
+
)
|
|
105
|
+
click.echo("\nImport complete: row-count parity confirmed for every table.")
|
|
@@ -361,6 +361,20 @@ def _open_postgres(dsn: str) -> Any:
|
|
|
361
361
|
return conn
|
|
362
362
|
|
|
363
363
|
|
|
364
|
+
def open_postgres_connection(dsn: str) -> Any:
|
|
365
|
+
"""Public entry point onto :func:`_open_postgres` for tooling that needs
|
|
366
|
+
a fully-migrated Postgres connection outside the ``get_connection()``
|
|
367
|
+
singleton -- today, only ``coord.store_migrate``'s importer (#828), which
|
|
368
|
+
opens a target that may not (yet) be the DSN this process's own
|
|
369
|
+
``coordinator.yml`` names, so it calls this directly with whatever DSN
|
|
370
|
+
the operator gave it rather than going through :func:`get_connection`'s
|
|
371
|
+
config-resolution path. Same guarantees as every other caller of
|
|
372
|
+
:func:`_open_postgres`: refuses under pytest, and runs the same schema
|
|
373
|
+
creation/migration path SQLite gets (#827 item 3).
|
|
374
|
+
"""
|
|
375
|
+
return _open_postgres(dsn)
|
|
376
|
+
|
|
377
|
+
|
|
364
378
|
# #2752: a clean, tagged release is always exactly "X.Y.Z" -- setuptools_scm
|
|
365
379
|
# only emits anything else (a ".devN+g<sha>" local/dev suffix, a bare
|
|
366
380
|
# "0+unknown" when no distribution resolves at all, or git-describe's
|
|
@@ -46,8 +46,10 @@ text for the same intent.
|
|
|
46
46
|
|
|
47
47
|
from __future__ import annotations
|
|
48
48
|
|
|
49
|
+
import re
|
|
49
50
|
from pathlib import Path
|
|
50
51
|
from typing import Any, Iterable, Sequence
|
|
52
|
+
from urllib.parse import urlsplit, urlunsplit
|
|
51
53
|
|
|
52
54
|
# ── dialects ──────────────────────────────────────────────────────────────
|
|
53
55
|
#
|
|
@@ -71,6 +73,92 @@ class UnsupportedDialectError(ValueError):
|
|
|
71
73
|
"""Raised when a connection's driver module maps to no known dialect."""
|
|
72
74
|
|
|
73
75
|
|
|
76
|
+
#: What to tell a caller who hit a Postgres codepath without the extra
|
|
77
|
+
#: installed -- mirrors ``coord.commands._common.SERVER_EXTRA_INSTALL_HINT``'s
|
|
78
|
+
#: shape for the ``[server]`` extra.
|
|
79
|
+
POSTGRES_EXTRA_INSTALL_HINT = "pip install 'code-coordinator[postgres]'"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# Libpq keyword=value DSN tokens: ``key=value`` or ``key='quoted value'``
|
|
83
|
+
# (single-quoted values may escape ``\'`` and ``\\`` per libpq's own
|
|
84
|
+
# grammar). Used only by :func:`redact_dsn` below.
|
|
85
|
+
_DSN_KV_RE = re.compile(r"(\w+)\s*=\s*('(?:\\.|[^'\\])*'|\S+)")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def redact_dsn(dsn: str) -> str:
|
|
89
|
+
"""*dsn* with every credential-bearing field removed -- safe to print,
|
|
90
|
+
log, or post as a GitHub comment.
|
|
91
|
+
|
|
92
|
+
A Postgres DSN routinely embeds ``user:password@host`` (URI form,
|
|
93
|
+
``postgresql://user:pass@host:port/db``) or ``user=... password=...``
|
|
94
|
+
(libpq keyword=value form, ``host=... dbname=... user=... password=...``)
|
|
95
|
+
-- ``coord/db.py``'s ``_migrate_if_needed`` docstring already states the
|
|
96
|
+
policy this exists to satisfy: a DSN must "deliberately never" appear in
|
|
97
|
+
text that "can end up in a log or a GitHub comment", since agent failure
|
|
98
|
+
reports post their captured stdout/stderr verbatim. Every caller that
|
|
99
|
+
would otherwise echo a configured ``store.dsn`` (e.g. ``coord
|
|
100
|
+
migrate-to-postgres``'s ``--dsn`` echo) must route through this first.
|
|
101
|
+
|
|
102
|
+
Returns host/dbname only (port too, when the DSN specifies one) -- not a
|
|
103
|
+
masked-but-recognizable form, so nothing of the credential survives even
|
|
104
|
+
truncated. Handles both DSN shapes; an unparseable field is rendered as
|
|
105
|
+
``?`` rather than raising, since this exists for a diagnostic message,
|
|
106
|
+
not validation -- a malformed DSN should fail *later*, at
|
|
107
|
+
:func:`connect`, with a real error naming what's wrong.
|
|
108
|
+
"""
|
|
109
|
+
stripped = dsn.strip()
|
|
110
|
+
if "://" in stripped:
|
|
111
|
+
parts = urlsplit(stripped)
|
|
112
|
+
host = parts.hostname or "?"
|
|
113
|
+
if parts.port:
|
|
114
|
+
host = f"{host}:{parts.port}"
|
|
115
|
+
dbname = parts.path.lstrip("/") or "?"
|
|
116
|
+
return urlunsplit((parts.scheme, host, dbname, "", ""))
|
|
117
|
+
|
|
118
|
+
def _unquote(value: str) -> str:
|
|
119
|
+
if len(value) >= 2 and value[0] == "'" and value[-1] == "'":
|
|
120
|
+
return value[1:-1].replace("\\'", "'").replace("\\\\", "\\")
|
|
121
|
+
return value
|
|
122
|
+
|
|
123
|
+
fields = {key: _unquote(value) for key, value in _DSN_KV_RE.findall(stripped)}
|
|
124
|
+
host = fields.get("host", "?")
|
|
125
|
+
if fields.get("port"):
|
|
126
|
+
host = f"{host}:{fields['port']}"
|
|
127
|
+
dbname = fields.get("dbname", "?")
|
|
128
|
+
return f"host={host} dbname={dbname}"
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _import_psycopg() -> Any:
|
|
132
|
+
"""Import ``psycopg``, translating its absence into an actionable message
|
|
133
|
+
(#2886).
|
|
134
|
+
|
|
135
|
+
``psycopg`` is an optional dependency -- the ``postgres`` extra -- never a
|
|
136
|
+
base or ``[dev]`` one (see ``pyproject.toml``'s ``[project.optional-
|
|
137
|
+
dependencies]``): every existing SQLite deployment must keep working
|
|
138
|
+
without ever pulling it in. Hitting this on an install that never asked
|
|
139
|
+
for Postgres is therefore the expected, common case, not a bug -- so
|
|
140
|
+
every Postgres call site in this module that needs the driver
|
|
141
|
+
(:func:`connect`, :func:`row_factory_for`, :func:`driver_error`) routes
|
|
142
|
+
its import through here rather than a bare ``import psycopg``, so the
|
|
143
|
+
failure names the extra to install instead of surfacing a raw
|
|
144
|
+
``ModuleNotFoundError: No module named 'psycopg'`` traceback.
|
|
145
|
+
|
|
146
|
+
:func:`driver_errors` deliberately does NOT route through here -- it
|
|
147
|
+
degrades silently to ``(sqlite3.Error,)`` when psycopg is absent (that is
|
|
148
|
+
its whole contract), so it keeps its own bare ``import psycopg`` inside a
|
|
149
|
+
caught ``try/except ImportError`` rather than raising through this
|
|
150
|
+
helper's message just to swallow it unread.
|
|
151
|
+
"""
|
|
152
|
+
try:
|
|
153
|
+
import psycopg # noqa: PLC0415 -- optional dep, see docstring
|
|
154
|
+
except ImportError as exc: # ModuleNotFoundError is a subclass
|
|
155
|
+
raise ModuleNotFoundError(
|
|
156
|
+
"the Postgres backend needs the `psycopg` driver, which is not "
|
|
157
|
+
f"installed. Install it with: {POSTGRES_EXTRA_INSTALL_HINT}"
|
|
158
|
+
) from exc
|
|
159
|
+
return psycopg
|
|
160
|
+
|
|
161
|
+
|
|
74
162
|
def detect_dialect(conn: Any) -> str:
|
|
75
163
|
"""Identify *conn*'s SQL dialect from its concrete connection type.
|
|
76
164
|
|
|
@@ -136,7 +224,7 @@ def connect(
|
|
|
136
224
|
superseded #2766 decision note.
|
|
137
225
|
|
|
138
226
|
**Postgres** (``dsn`` required): ``psycopg.connect(dsn)``. ``psycopg`` is
|
|
139
|
-
an optional dependency (see :func:`
|
|
227
|
+
an optional dependency (see :func:`_import_psycopg`) imported
|
|
140
228
|
function-locally, so calling this with ``backend=DIALECT_POSTGRES`` before
|
|
141
229
|
psycopg is installed raises ``ImportError``/``ModuleNotFoundError`` rather
|
|
142
230
|
than breaking import of this module for everyone else. *read_only* has no
|
|
@@ -157,7 +245,7 @@ def connect(
|
|
|
157
245
|
if backend == DIALECT_POSTGRES:
|
|
158
246
|
if not dsn:
|
|
159
247
|
raise ValueError("sql.connect(backend='postgres') requires dsn")
|
|
160
|
-
|
|
248
|
+
psycopg = _import_psycopg()
|
|
161
249
|
|
|
162
250
|
return psycopg.connect(dsn)
|
|
163
251
|
raise UnsupportedDialectError(backend)
|
|
@@ -348,19 +436,20 @@ def row_factory_for(dialect: str) -> Any:
|
|
|
348
436
|
|
|
349
437
|
``sqlite3.Row`` is returned directly (it's a base-dependency import,
|
|
350
438
|
already used throughout this tree). ``psycopg.rows.dict_row`` is
|
|
351
|
-
imported function-locally -- ``psycopg`` is
|
|
352
|
-
``
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
439
|
+
imported function-locally -- ``psycopg`` is an optional dependency (the
|
|
440
|
+
``postgres`` extra, #2886), never a base or ``[dev]`` one (see
|
|
441
|
+
``pyproject.toml``'s ``[project.optional-dependencies]``) -- so calling
|
|
442
|
+
this with :data:`DIALECT_POSTGRES` before the extra is installed raises
|
|
443
|
+
``ImportError``/``ModuleNotFoundError``, naming the extra to install
|
|
444
|
+
(see :func:`_import_psycopg`), rather than breaking import of this
|
|
445
|
+
module for everyone else.
|
|
358
446
|
"""
|
|
359
447
|
if dialect == DIALECT_SQLITE:
|
|
360
448
|
import sqlite3
|
|
361
449
|
|
|
362
450
|
return sqlite3.Row
|
|
363
451
|
if dialect == DIALECT_POSTGRES:
|
|
452
|
+
_import_psycopg() # translate a missing psycopg into an actionable message
|
|
364
453
|
from psycopg.rows import dict_row # noqa: PLC0415 -- optional dep, see docstring
|
|
365
454
|
|
|
366
455
|
return dict_row
|
|
@@ -440,6 +529,77 @@ def autoincrement_pk_ddl(dialect: str) -> str:
|
|
|
440
529
|
raise UnsupportedDialectError(dialect)
|
|
441
530
|
|
|
442
531
|
|
|
532
|
+
def identity_columns(conn: Any, table: str) -> list[str]:
|
|
533
|
+
"""Column names in *table* declared ``GENERATED { ALWAYS | BY DEFAULT }
|
|
534
|
+
AS IDENTITY`` -- i.e. produced by :func:`autoincrement_pk_ddl`'s Postgres
|
|
535
|
+
branch. Always ``[]`` on SQLite: ``AUTOINCREMENT`` is a ROWID alias, not
|
|
536
|
+
a separate sequence object, so there is nothing to fall out of sync
|
|
537
|
+
(see :func:`resync_identity_sequence`).
|
|
538
|
+
|
|
539
|
+
Used by ``coord.store_migrate.import_table`` -- a bulk import writes
|
|
540
|
+
explicit ``id`` values into these columns (accepted by
|
|
541
|
+
``GENERATED BY DEFAULT``, unlike ``GENERATED ALWAYS``), which does not
|
|
542
|
+
itself advance the underlying sequence, so the caller must resync it
|
|
543
|
+
afterward or the next ordinary write collides with an id the import
|
|
544
|
+
already used.
|
|
545
|
+
"""
|
|
546
|
+
dialect = detect_dialect(conn)
|
|
547
|
+
if dialect == DIALECT_SQLITE:
|
|
548
|
+
return []
|
|
549
|
+
if dialect == DIALECT_POSTGRES:
|
|
550
|
+
cur = execute(
|
|
551
|
+
conn,
|
|
552
|
+
"SELECT column_name FROM information_schema.columns "
|
|
553
|
+
"WHERE table_name = ? AND identity_generation IS NOT NULL "
|
|
554
|
+
"ORDER BY ordinal_position",
|
|
555
|
+
(table,),
|
|
556
|
+
)
|
|
557
|
+
names = []
|
|
558
|
+
for row in cur.fetchall():
|
|
559
|
+
try:
|
|
560
|
+
names.append(row["column_name"])
|
|
561
|
+
except (KeyError, TypeError, IndexError):
|
|
562
|
+
names.append(row[0])
|
|
563
|
+
return names
|
|
564
|
+
raise UnsupportedDialectError(dialect)
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
def resync_identity_sequence(conn: Any, table: str, column: str) -> None:
|
|
568
|
+
"""Advance *table*.*column*'s identity sequence to match the data
|
|
569
|
+
actually in the table -- a no-op on SQLite.
|
|
570
|
+
|
|
571
|
+
A bulk import that INSERTs explicit ``id`` values into a
|
|
572
|
+
``GENERATED BY DEFAULT AS IDENTITY`` column (see
|
|
573
|
+
:func:`autoincrement_pk_ddl`) does not advance that column's sequence as
|
|
574
|
+
a side effect -- the sequence only moves when something calls
|
|
575
|
+
``nextval()`` on it, which an explicit-value INSERT never does. Left
|
|
576
|
+
unresynced, the next ordinary write with no explicit id (how every
|
|
577
|
+
caller in this tree writes today) is handed a value the import already
|
|
578
|
+
used and rejected as a primary-key violation.
|
|
579
|
+
|
|
580
|
+
``setval(pg_get_serial_sequence(...), ..., is_called)``'s three-arg form
|
|
581
|
+
is used rather than the two-arg form specifically for the empty-table
|
|
582
|
+
case: with *is_called* explicitly computed as "does the table have any
|
|
583
|
+
rows", an empty table correctly leaves the sequence so the *next*
|
|
584
|
+
``nextval()`` returns the identity's own start value (1) instead of 2,
|
|
585
|
+
which the two-arg form (which always behaves as if ``is_called=true``)
|
|
586
|
+
would get wrong.
|
|
587
|
+
"""
|
|
588
|
+
dialect = detect_dialect(conn)
|
|
589
|
+
if dialect == DIALECT_SQLITE:
|
|
590
|
+
return
|
|
591
|
+
if dialect == DIALECT_POSTGRES:
|
|
592
|
+
execute(
|
|
593
|
+
conn,
|
|
594
|
+
"SELECT setval(pg_get_serial_sequence(?, ?), "
|
|
595
|
+
f'COALESCE((SELECT MAX("{column}") FROM "{table}"), 1), ' # noqa: S608 -- column/table from introspection, not user input
|
|
596
|
+
f'(SELECT MAX("{column}") FROM "{table}") IS NOT NULL)', # noqa: S608
|
|
597
|
+
(table, column),
|
|
598
|
+
)
|
|
599
|
+
return
|
|
600
|
+
raise UnsupportedDialectError(dialect)
|
|
601
|
+
|
|
602
|
+
|
|
443
603
|
# SQLite has no BOOLEAN type -- every flag column in coord/db.py's schema
|
|
444
604
|
# (e.g. ``pinned INTEGER NOT NULL DEFAULT 0``, ``hold_after INTEGER NOT
|
|
445
605
|
# NULL DEFAULT 0``) is declared ``INTEGER DEFAULT 0``, using 0/1 as
|
|
@@ -568,6 +728,71 @@ def table_columns(conn: Any, table: str) -> list[tuple[str, str]]:
|
|
|
568
728
|
raise UnsupportedDialectError(dialect)
|
|
569
729
|
|
|
570
730
|
|
|
731
|
+
def foreign_keys(conn: Any, table: str) -> list[tuple[str, str, str]]:
|
|
732
|
+
"""Return ``[(from_column, ref_table, ref_column), ...]`` for every FK
|
|
733
|
+
*table* declares (empty if none, or if *table* doesn't exist) --
|
|
734
|
+
portably across SQLite's ``PRAGMA foreign_key_list(...)`` and Postgres's
|
|
735
|
+
standard ``information_schema`` constraint views (#828).
|
|
736
|
+
|
|
737
|
+
SQLite's FK introspection is a pragma, like ``table_info`` above -- same
|
|
738
|
+
reasoning, same fix: this is the one place that pragma's statement text
|
|
739
|
+
may appear outside ``coord/db.py``, so a caller (``coord.store_migrate``,
|
|
740
|
+
today) never writes it directly. Postgres has no single-pragma
|
|
741
|
+
equivalent; the standard three-way join across
|
|
742
|
+
``information_schema.table_constraints`` /
|
|
743
|
+
``key_column_usage`` / ``constraint_column_usage`` is the SQL-standard
|
|
744
|
+
way to ask "what does this table reference, and through which column"
|
|
745
|
+
without touching Postgres's own (non-standard) ``pg_catalog`` tables.
|
|
746
|
+
|
|
747
|
+
The table name is interpolated into the SQLite ``PRAGMA`` text for the
|
|
748
|
+
same reason :func:`table_columns` does -- pragmas take no bound
|
|
749
|
+
parameter for their target object; every call site passes a hardcoded
|
|
750
|
+
table constant, never user input.
|
|
751
|
+
|
|
752
|
+
Known limitation, Postgres branch: the three-way join keys purely on
|
|
753
|
+
``constraint_name``/``table_schema``, with no ordinal-position join
|
|
754
|
+
between ``key_column_usage`` and ``constraint_column_usage``. For a
|
|
755
|
+
*composite* (multi-column) foreign key this can mis-pair columns --
|
|
756
|
+
e.g. return ``(col_a, ref_table, ref_col_b)`` instead of the two
|
|
757
|
+
correctly-paired single-column edges. Not triggered today: the schema
|
|
758
|
+
has exactly one FK, and it's single-column. Fix before adding a
|
|
759
|
+
composite FK to ``coord/db.py``'s schema: join on ``ordinal_position``
|
|
760
|
+
too (Postgres exposes it on both views).
|
|
761
|
+
"""
|
|
762
|
+
dialect = detect_dialect(conn)
|
|
763
|
+
if dialect == DIALECT_SQLITE:
|
|
764
|
+
cur = execute(conn, f"PRAGMA foreign_key_list({table})") # noqa: S608 -- table name, not user input
|
|
765
|
+
edges = []
|
|
766
|
+
for row in cur.fetchall():
|
|
767
|
+
values = tuple(row)
|
|
768
|
+
# id, seq, table, from, to, on_update, on_delete, match
|
|
769
|
+
edges.append((values[3], values[2], values[4] or "rowid"))
|
|
770
|
+
return edges
|
|
771
|
+
if dialect == DIALECT_POSTGRES:
|
|
772
|
+
cur = execute(
|
|
773
|
+
conn,
|
|
774
|
+
"SELECT kcu.column_name, ccu.table_name AS ref_table, "
|
|
775
|
+
"ccu.column_name AS ref_column "
|
|
776
|
+
"FROM information_schema.table_constraints tc "
|
|
777
|
+
"JOIN information_schema.key_column_usage kcu "
|
|
778
|
+
" ON tc.constraint_name = kcu.constraint_name "
|
|
779
|
+
" AND tc.table_schema = kcu.table_schema "
|
|
780
|
+
"JOIN information_schema.constraint_column_usage ccu "
|
|
781
|
+
" ON tc.constraint_name = ccu.constraint_name "
|
|
782
|
+
" AND tc.table_schema = ccu.table_schema "
|
|
783
|
+
"WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = ?",
|
|
784
|
+
(table,),
|
|
785
|
+
)
|
|
786
|
+
edges = []
|
|
787
|
+
for row in cur.fetchall():
|
|
788
|
+
try:
|
|
789
|
+
edges.append((row["column_name"], row["ref_table"], row["ref_column"]))
|
|
790
|
+
except (KeyError, TypeError, IndexError):
|
|
791
|
+
edges.append((row[0], row[1], row[2]))
|
|
792
|
+
return edges
|
|
793
|
+
raise UnsupportedDialectError(dialect)
|
|
794
|
+
|
|
795
|
+
|
|
571
796
|
# ── WAL (#2782) ───────────────────────────────────────────────────────────
|
|
572
797
|
#
|
|
573
798
|
# WAL is a SQLite storage concept with no Postgres equivalent at all -- unlike
|
|
@@ -615,7 +840,7 @@ def driver_error(conn: Any) -> type[BaseException]:
|
|
|
615
840
|
|
|
616
841
|
return sqlite3.Error
|
|
617
842
|
if dialect == DIALECT_POSTGRES:
|
|
618
|
-
|
|
843
|
+
psycopg = _import_psycopg()
|
|
619
844
|
|
|
620
845
|
return psycopg.Error
|
|
621
846
|
raise UnsupportedDialectError(dialect)
|
|
@@ -637,13 +862,15 @@ def driver_errors() -> tuple[type[BaseException], ...]:
|
|
|
637
862
|
instead of a retried write.
|
|
638
863
|
|
|
639
864
|
``sqlite3`` is a stdlib module -- always present, always included.
|
|
640
|
-
``psycopg`` is not a
|
|
641
|
-
so its absence is the normal case today, not an
|
|
642
|
-
``(sqlite3.Error,)`` rather than raising
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
865
|
+
``psycopg`` is an optional dependency, not a base or ``[dev]`` one (see
|
|
866
|
+
:func:`_import_psycopg`), so its absence is the normal case today, not an
|
|
867
|
+
error: this degrades to ``(sqlite3.Error,)`` rather than raising
|
|
868
|
+
``ImportError`` -- unlike every other Postgres call site in this module,
|
|
869
|
+
this one does NOT route through :func:`_import_psycopg` and its
|
|
870
|
+
actionable message, precisely because the message would just be
|
|
871
|
+
swallowed unread by the ``except ImportError`` below; there is no dialect
|
|
872
|
+
to detect at all here, so degrading silently (not even
|
|
873
|
+
function-local, deferred-import-style) is correct: a caller doing
|
|
647
874
|
``except sql.driver_errors():`` on a SQLite-only install must keep
|
|
648
875
|
behaving exactly as ``except sqlite3.OperationalError:`` always did.
|
|
649
876
|
|
|
@@ -656,7 +883,7 @@ def driver_errors() -> tuple[type[BaseException], ...]:
|
|
|
656
883
|
|
|
657
884
|
errors: list[type[BaseException]] = [sqlite3.Error]
|
|
658
885
|
try:
|
|
659
|
-
import psycopg # noqa: PLC0415 -- optional dep, see
|
|
886
|
+
import psycopg # noqa: PLC0415 -- optional dep, absence degrades silently, see docstring
|
|
660
887
|
except ImportError:
|
|
661
888
|
pass
|
|
662
889
|
else:
|