code-coordinator 0.5.492__tar.gz → 0.5.493__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.492 → code_coordinator-0.5.493}/PKG-INFO +1 -1
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/db.py +123 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/state.py +171 -29
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_db.py +118 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_state.py +423 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/.gitignore +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/CLAUDE.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/GOAL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/LICENSE +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/MANIFEST.in +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/README.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/__init__.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/agent.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/audit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/backup.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/block_log.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/board_service.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/brain.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/claim.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/claude_setup_token.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/cli.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/client.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/codegen.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/comments.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/config.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dao.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/deps.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dispatch_liveness.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/drive.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/events.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/failure_classifier.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/filelock.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/freshness.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/gates.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/goal.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/context.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/models.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/render.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/health/units.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/hooks.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/interactive.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/invariant_alarms.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/machine_fault.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/models.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/network.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/notify.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/openapi.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/parentage.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/plans.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/progress.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/release_window.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/reports.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/review.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/self_health.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/smoke.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/split_work.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/sql.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/test_author.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/test_report.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/usage.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/install-agent.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/pyproject.toml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/setup.cfg +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/__init__.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/backends.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/conftest.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_claude_setup_token.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_status_invariant_alarms.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_status_machine_fault.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_status_retried_3340.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_client.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_config.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dispatch_liveness.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dispatch_workers.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_drive_machine_fault.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_events.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_failure_classifier.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_fix_escalation_classifier.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_housekeeping.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_init.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_invariant_alarms.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_machine_fault.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_models.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_network.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_cordon_drain_stall_3336.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_retry_escalation_classify_3360.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_review.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_session.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_smoke_fanout_manifest_3333.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_split.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.492 → code_coordinator-0.5.493}/tests/write_parity.py +0 -0
|
@@ -666,6 +666,129 @@ def rollback_after_driver_error(conn: Any | None, exc: BaseException) -> None:
|
|
|
666
666
|
pass
|
|
667
667
|
|
|
668
668
|
|
|
669
|
+
def undo_pending_write(conn: Any | None, exc: BaseException, *, undo: Callable[[], Any]) -> None:
|
|
670
|
+
"""Run *undo* — a compensating statement touching only THIS write's own
|
|
671
|
+
row — after *exc*, the #3382 sibling of
|
|
672
|
+
:func:`rollback_after_driver_error` for a writer whose own
|
|
673
|
+
``conn.commit()`` call, not just the statement before it, can raise.
|
|
674
|
+
|
|
675
|
+
:func:`rollback_after_driver_error` deliberately no-ops for a plain
|
|
676
|
+
SQLite error (see its docstring): that is correct when the failure is a
|
|
677
|
+
STATEMENT that never got to write anything — SQLite's ``SQLITE_BUSY``,
|
|
678
|
+
hit while acquiring the lock a write needs, leaves nothing applied, so
|
|
679
|
+
simply re-running the whole write closure from scratch (what
|
|
680
|
+
:func:`retry_on_locked` does) is exactly as good as a rollback.
|
|
681
|
+
|
|
682
|
+
That reasoning does not hold when it is ``conn.commit()`` itself that
|
|
683
|
+
raises. WAL-checkpoint contention can make ``COMMIT`` hit
|
|
684
|
+
``SQLITE_BUSY`` *after* the statement(s) before it already applied
|
|
685
|
+
inside the still-open transaction — the write is neither committed nor
|
|
686
|
+
undone, so it sits there, genuinely pending, on ``coord.db``'s shared
|
|
687
|
+
process-wide connection, ready for a completely unrelated handler's next
|
|
688
|
+
unrelated ``commit()`` to durably persist it later. #3382: this is
|
|
689
|
+
exactly how a ``review_claims`` row survived two callers who each saw
|
|
690
|
+
their own ``/review-claim`` POST fail with a 503 — neither call's own
|
|
691
|
+
retry-free write had anything guarding its ``commit()``, so the pending
|
|
692
|
+
insert outlived both failed calls and was swept up by a later,
|
|
693
|
+
completely unrelated write on the same shared connection.
|
|
694
|
+
|
|
695
|
+
A bare retry of the closure does not fix this the way it fixes a failed
|
|
696
|
+
statement, either: an ``INSERT OR IGNORE`` re-run against its own
|
|
697
|
+
still-pending prior insert reads back as a conflict (``rowcount == 0``),
|
|
698
|
+
so the retry silently misreports "someone else already holds this
|
|
699
|
+
claim" about a claim only this process's own earlier, abandoned attempt
|
|
700
|
+
took.
|
|
701
|
+
|
|
702
|
+
**Why a compensating statement, and not a transaction-level undo of any
|
|
703
|
+
kind (#3382 review rounds 1 and 2).** Two earlier shapes of this
|
|
704
|
+
function were both rejected, for the same underlying reason:
|
|
705
|
+
|
|
706
|
+
* ``conn.rollback()`` (round 1). On ``coord.db``'s shared, process-wide
|
|
707
|
+
SQLite singleton (see this module's own docstring), that discards
|
|
708
|
+
*every* other thread's not-yet-committed statement too — this process
|
|
709
|
+
dispatches other ``_*_local`` writers through ``run_in_threadpool`` on
|
|
710
|
+
real OS worker threads (the daemon's periodic tick, the ``/board``
|
|
711
|
+
build, ``/assignment/*`` handlers), and Python's ``sqlite3`` joins ANY
|
|
712
|
+
thread's statement issued on this one connection between commits into
|
|
713
|
+
the SAME open transaction. An unrelated writer that already got
|
|
714
|
+
``sql.execute``/``sql.insert_ignore``'s success back (nothing in this
|
|
715
|
+
tree commits internally — see ``coord/sql.py``) then silently loses it
|
|
716
|
+
when its own later ``conn.commit()`` no-ops or raises ``cannot commit
|
|
717
|
+
- no transaction is active`` — this issue's own second logged symptom.
|
|
718
|
+
|
|
719
|
+
* ``SAVEPOINT`` + ``ROLLBACK TO SAVEPOINT`` (round 2), whether the
|
|
720
|
+
savepoint name is a shared literal or made unique per call. Unique
|
|
721
|
+
names fix only the narrower half of the problem (two concurrent calls
|
|
722
|
+
resolving each other's marker, since SQLite binds a name to the most
|
|
723
|
+
recently established savepoint of that name). They do **not** fix the
|
|
724
|
+
half that matters: ``ROLLBACK TO SAVEPOINT`` reverts the database to
|
|
725
|
+
its state *just after that savepoint was established*, so it undoes
|
|
726
|
+
every statement issued since — including another thread's, which this
|
|
727
|
+
writer has no business undoing — and destroys that thread's own
|
|
728
|
+
savepoints along the way. Verified against a real ``sqlite3``
|
|
729
|
+
connection (Python 3.12, SQLite 3.45): with two distinctly-named
|
|
730
|
+
savepoints opened back to back and one row inserted after each,
|
|
731
|
+
``ROLLBACK TO`` the OUTER (uniquely-named) savepoint removes BOTH
|
|
732
|
+
rows. A transaction-scoped undo simply cannot express "mine only" on a
|
|
733
|
+
connection several threads write through.
|
|
734
|
+
|
|
735
|
+
So the undo is row-scoped instead: *undo* issues one statement that
|
|
736
|
+
names this write's own row and nothing else (delete the row this call
|
|
737
|
+
inserted, identified by its own ``claimed_at`` stamp; re-insert the row
|
|
738
|
+
this call deleted, with the ``claimed_at`` it read back first). It is
|
|
739
|
+
exact regardless of how other threads' statements interleave with this
|
|
740
|
+
one — before the failure or after it — because it never refers to their
|
|
741
|
+
rows.
|
|
742
|
+
|
|
743
|
+
It also degrades better than a transaction-level undo when an unrelated
|
|
744
|
+
thread's ``commit()`` lands *between* this write's statement and this
|
|
745
|
+
recovery: a savepoint would already have been destroyed by that commit
|
|
746
|
+
(``COMMIT`` releases all savepoints), leaving ``ROLLBACK TO`` to fail
|
|
747
|
+
and this write's row durably committed and leaked — precisely the
|
|
748
|
+
incident. The compensating statement instead stays pending and is
|
|
749
|
+
flushed by whichever ``commit()`` reaches it next (this closure's own
|
|
750
|
+
retry, or another writer's), so the net effect on this row is still
|
|
751
|
+
nothing.
|
|
752
|
+
|
|
753
|
+
Call this from the ``except sql.driver_errors():`` block of a write
|
|
754
|
+
closure that both executes a statement *and* calls ``conn.commit()``
|
|
755
|
+
itself, and **only when that closure's own statement actually applied**
|
|
756
|
+
(``cursor.rowcount``) — a statement that failed applied nothing, so
|
|
757
|
+
there is nothing to compensate, the same "a failed STATEMENT applies
|
|
758
|
+
nothing" reasoning :func:`rollback_after_driver_error` already
|
|
759
|
+
documents. Today's callers are the ``review_claims``/``smoke_claims``
|
|
760
|
+
claim and release writes in ``coord/state.py`` (#3113/#3333), the two
|
|
761
|
+
sites where "did this claim land" is an exclusive-ownership decision the
|
|
762
|
+
rest of the system relies on, unlike most of this module's writers where
|
|
763
|
+
a duplicate-on-retry UPDATE/DELETE is harmless.
|
|
764
|
+
|
|
765
|
+
Unlike :func:`rollback_after_driver_error`, this does not inspect *exc*
|
|
766
|
+
for a SQLSTATE: the plain-SQLite case above is exactly what it exists to
|
|
767
|
+
cover. On Postgres it is a harmless no-op in practice — a failed
|
|
768
|
+
``COMMIT`` there aborts the whole transaction (so *undo* raises
|
|
769
|
+
``InFailedSqlTransaction``, suppressed below) and
|
|
770
|
+
:func:`retry_on_locked`'s own :func:`rollback_after_driver_error` call
|
|
771
|
+
has already undone this write for real; ``get_connection()`` also hands
|
|
772
|
+
each THREAD its own connection there (see this module's docstring), so
|
|
773
|
+
no other thread's statement was ever at risk.
|
|
774
|
+
|
|
775
|
+
Same suppression rule as :func:`rollback_after_driver_error`: a ``None``
|
|
776
|
+
*conn* is a no-op, and a failure of *undo* itself is swallowed so it
|
|
777
|
+
never masks *exc*, the exception actually worth seeing. If the
|
|
778
|
+
compensating statement cannot run either (sustained contention
|
|
779
|
+
outlasting even this), this write's own row is left pending for the next
|
|
780
|
+
writer's eventual commit/rollback to resolve — the same residual,
|
|
781
|
+
already-accepted risk :func:`rollback_after_driver_error`'s own
|
|
782
|
+
suppressed-failure path carries today, not a new one.
|
|
783
|
+
"""
|
|
784
|
+
if conn is None:
|
|
785
|
+
return
|
|
786
|
+
try:
|
|
787
|
+
undo()
|
|
788
|
+
except Exception: # noqa: BLE001 — never mask the caught driver error
|
|
789
|
+
pass
|
|
790
|
+
|
|
791
|
+
|
|
669
792
|
# #2538: a handful of consecutive short retries — long enough to ride out a
|
|
670
793
|
# concurrent writer (the daemon's own passive tick, another `coord merge`/
|
|
671
794
|
# `coord notify` invocation) that only holds the DB for a moment, short
|
|
@@ -52,6 +52,7 @@ from coord.db import (
|
|
|
52
52
|
is_lock_contention_error,
|
|
53
53
|
retry_on_locked,
|
|
54
54
|
rollback_after_driver_error,
|
|
55
|
+
undo_pending_write,
|
|
55
56
|
)
|
|
56
57
|
from coord.models import (
|
|
57
58
|
WORK_LIKE_TYPES,
|
|
@@ -2629,15 +2630,63 @@ def _claim_review_dispatch_local(of_assignment_id: str) -> bool:
|
|
|
2629
2630
|
"""Local-DB write for :func:`claim_review_dispatch`.
|
|
2630
2631
|
|
|
2631
2632
|
Called directly by the daemon endpoint so it never re-routes back over
|
|
2632
|
-
HTTP — mirrors every other ``_*_local`` write in this module.
|
|
2633
|
+
HTTP — mirrors every other ``_*_local`` write in this module. The
|
|
2634
|
+
``/review-claim`` endpoint itself calls this synchronously, not via
|
|
2635
|
+
``run_in_threadpool`` — the two review-claim endpoints can't race each
|
|
2636
|
+
other's writes — but ``coord.db.get_connection()``'s connection is the
|
|
2637
|
+
same process-wide SQLite singleton every OTHER ``_*_local`` writer this
|
|
2638
|
+
process dispatches through ``run_in_threadpool`` on a real OS worker
|
|
2639
|
+
thread uses too (#3382 review).
|
|
2640
|
+
|
|
2641
|
+
#3382: wrapped in :func:`coord.db.retry_on_locked`, unlike this
|
|
2642
|
+
function's original shape which had no lock-contention handling at all
|
|
2643
|
+
— a `database is locked` collision raised straight out to the caller as
|
|
2644
|
+
a 503 with nothing retried. On top of the retry, when the `INSERT OR
|
|
2645
|
+
IGNORE` applied but the `conn.commit()` after it raised, the closure
|
|
2646
|
+
undoes its own just-inserted row via
|
|
2647
|
+
:func:`coord.db.undo_pending_write` before re-raising — see that
|
|
2648
|
+
function's docstring for why the undo is a compensating statement
|
|
2649
|
+
naming THIS row rather than any transaction-level rollback (neither a
|
|
2650
|
+
bare ``conn.rollback()`` nor ``ROLLBACK TO SAVEPOINT`` can express
|
|
2651
|
+
"mine only" on a connection several threads write through). Without it,
|
|
2652
|
+
a `conn.commit()` failure leaves a just-applied insert pending on the
|
|
2653
|
+
shared connection for a wholly unrelated handler's next commit to
|
|
2654
|
+
durably persist later — the incident this issue reports, a
|
|
2655
|
+
`review_claims` row held by neither of the two calls that raced for it,
|
|
2656
|
+
wedging vimcode#1086's review for ~13.5h.
|
|
2633
2657
|
"""
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
conn
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2658
|
+
|
|
2659
|
+
def _write() -> int:
|
|
2660
|
+
conn = get_connection()
|
|
2661
|
+
claimed_at = time.time()
|
|
2662
|
+
inserted = 0
|
|
2663
|
+
try:
|
|
2664
|
+
cur = sql.insert_ignore(
|
|
2665
|
+
conn, "review_claims", ["of_assignment_id", "claimed_at"],
|
|
2666
|
+
(of_assignment_id, claimed_at),
|
|
2667
|
+
)
|
|
2668
|
+
inserted = cur.rowcount or 0
|
|
2669
|
+
conn.commit()
|
|
2670
|
+
except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
|
|
2671
|
+
if inserted:
|
|
2672
|
+
# Only this call's own row: `claimed_at` is the stamp THIS
|
|
2673
|
+
# attempt generated, so a claim another process legitimately
|
|
2674
|
+
# holds (different stamp) is never touched. `inserted == 0`
|
|
2675
|
+
# means the insert either lost the race or never applied at
|
|
2676
|
+
# all — nothing of ours to compensate for.
|
|
2677
|
+
undo_pending_write(
|
|
2678
|
+
conn, exc,
|
|
2679
|
+
undo=lambda: sql.execute(
|
|
2680
|
+
conn,
|
|
2681
|
+
"DELETE FROM review_claims "
|
|
2682
|
+
"WHERE of_assignment_id=? AND claimed_at=?",
|
|
2683
|
+
(of_assignment_id, claimed_at),
|
|
2684
|
+
),
|
|
2685
|
+
)
|
|
2686
|
+
raise
|
|
2687
|
+
return inserted
|
|
2688
|
+
|
|
2689
|
+
return retry_on_locked(_write) > 0
|
|
2641
2690
|
|
|
2642
2691
|
|
|
2643
2692
|
def has_review_claim(of_assignment_id: str) -> bool:
|
|
@@ -2730,11 +2779,48 @@ def _release_review_dispatch_claim_local(of_assignment_id: str) -> None:
|
|
|
2730
2779
|
Called directly by the daemon endpoint so it never re-routes back over
|
|
2731
2780
|
HTTP, and by ``coord.issue_store._update_local_state`` (which always runs
|
|
2732
2781
|
against whatever DB is local to that process — the canonical one, when
|
|
2733
|
-
that process is the daemon or a non-thin-client host
|
|
2782
|
+
that process is the daemon or a non-thin-client host, and which CAN run
|
|
2783
|
+
on a ``run_in_threadpool`` worker thread — #3382 review).
|
|
2784
|
+
|
|
2785
|
+
#3382: same `retry_on_locked` + undo-this-row-on-commit-failure
|
|
2786
|
+
treatment as :func:`_claim_review_dispatch_local` — see that function's
|
|
2787
|
+
docstring and :func:`coord.db.undo_pending_write`'s for why the undo is
|
|
2788
|
+
a compensating statement rather than any transaction-level rollback.
|
|
2789
|
+
This write had neither before, and a lock collision here left a stray
|
|
2790
|
+
`DELETE` pending on the shared connection for the same reason the claim
|
|
2791
|
+
write did — so the undo here is the mirror image: put back the ONE row
|
|
2792
|
+
this call deleted, with the `claimed_at` it read back before deleting,
|
|
2793
|
+
leaving every other row (and every other thread's pending statement)
|
|
2794
|
+
exactly as it found them.
|
|
2734
2795
|
"""
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2796
|
+
|
|
2797
|
+
def _write() -> None:
|
|
2798
|
+
conn = get_connection()
|
|
2799
|
+
row = sql.execute(
|
|
2800
|
+
conn,
|
|
2801
|
+
"SELECT claimed_at FROM review_claims WHERE of_assignment_id=?",
|
|
2802
|
+
(of_assignment_id,),
|
|
2803
|
+
).fetchone()
|
|
2804
|
+
claimed_at = row[0] if row is not None else None
|
|
2805
|
+
deleted = 0
|
|
2806
|
+
try:
|
|
2807
|
+
cur = sql.execute(
|
|
2808
|
+
conn, "DELETE FROM review_claims WHERE of_assignment_id=?", (of_assignment_id,)
|
|
2809
|
+
)
|
|
2810
|
+
deleted = cur.rowcount or 0
|
|
2811
|
+
conn.commit()
|
|
2812
|
+
except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
|
|
2813
|
+
if deleted and claimed_at is not None:
|
|
2814
|
+
undo_pending_write(
|
|
2815
|
+
conn, exc,
|
|
2816
|
+
undo=lambda: sql.insert_ignore(
|
|
2817
|
+
conn, "review_claims", ["of_assignment_id", "claimed_at"],
|
|
2818
|
+
(of_assignment_id, claimed_at),
|
|
2819
|
+
),
|
|
2820
|
+
)
|
|
2821
|
+
raise
|
|
2822
|
+
|
|
2823
|
+
retry_on_locked(_write)
|
|
2738
2824
|
|
|
2739
2825
|
|
|
2740
2826
|
def release_review_claim_if_row_is_review(assignment_id: str) -> None:
|
|
@@ -2843,16 +2929,43 @@ def _claim_smoke_dispatch_local(work_assignment_id: str, capability_partition: s
|
|
|
2843
2929
|
"""Local-DB write for :func:`claim_smoke_dispatch`.
|
|
2844
2930
|
|
|
2845
2931
|
Called directly by the daemon endpoint so it never re-routes back over
|
|
2846
|
-
HTTP — mirrors :func:`_claim_review_dispatch_local
|
|
2932
|
+
HTTP — mirrors :func:`_claim_review_dispatch_local`, including its
|
|
2933
|
+
#3382 `retry_on_locked` + row-scoped
|
|
2934
|
+
:func:`coord.db.undo_pending_write` treatment: this write is the
|
|
2935
|
+
same "INSERT OR IGNORE, then commit" exclusive-claim shape, so it was
|
|
2936
|
+
exposed to the identical 503-after-successful-write class that issue
|
|
2937
|
+
reports for the review claim table, and to the same review-flagged risk
|
|
2938
|
+
of a transaction-level rollback discarding an unrelated writer's own
|
|
2939
|
+
pending statement on the shared connection.
|
|
2847
2940
|
"""
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
conn
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2941
|
+
|
|
2942
|
+
def _write() -> int:
|
|
2943
|
+
conn = get_connection()
|
|
2944
|
+
claimed_at = time.time()
|
|
2945
|
+
inserted = 0
|
|
2946
|
+
try:
|
|
2947
|
+
cur = sql.insert_ignore(
|
|
2948
|
+
conn, "smoke_claims",
|
|
2949
|
+
["work_assignment_id", "capability_partition", "claimed_at"],
|
|
2950
|
+
(work_assignment_id, capability_partition, claimed_at),
|
|
2951
|
+
)
|
|
2952
|
+
inserted = cur.rowcount or 0
|
|
2953
|
+
conn.commit()
|
|
2954
|
+
except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
|
|
2955
|
+
if inserted:
|
|
2956
|
+
undo_pending_write(
|
|
2957
|
+
conn, exc,
|
|
2958
|
+
undo=lambda: sql.execute(
|
|
2959
|
+
conn,
|
|
2960
|
+
"DELETE FROM smoke_claims WHERE work_assignment_id=? "
|
|
2961
|
+
"AND capability_partition=? AND claimed_at=?",
|
|
2962
|
+
(work_assignment_id, capability_partition, claimed_at),
|
|
2963
|
+
),
|
|
2964
|
+
)
|
|
2965
|
+
raise
|
|
2966
|
+
return inserted
|
|
2967
|
+
|
|
2968
|
+
return retry_on_locked(_write) > 0
|
|
2856
2969
|
|
|
2857
2970
|
|
|
2858
2971
|
def release_smoke_dispatch_claim(work_assignment_id: str, capability_partition: str) -> None:
|
|
@@ -2887,15 +3000,44 @@ def _release_smoke_dispatch_claim_local(
|
|
|
2887
3000
|
|
|
2888
3001
|
Called directly by the daemon endpoint so it never re-routes back over
|
|
2889
3002
|
HTTP, and by :func:`release_smoke_claim_if_row_is_smoke_leg` (which
|
|
2890
|
-
always runs against whatever DB is local to that process
|
|
3003
|
+
always runs against whatever DB is local to that process, and CAN run
|
|
3004
|
+
on a ``run_in_threadpool`` worker thread — #3382 review).
|
|
3005
|
+
|
|
3006
|
+
#3382: same `retry_on_locked` + undo-this-row-on-commit-failure
|
|
3007
|
+
treatment as :func:`_release_review_dispatch_claim_local`.
|
|
2891
3008
|
"""
|
|
2892
|
-
|
|
2893
|
-
|
|
2894
|
-
conn
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
|
-
|
|
2898
|
-
|
|
3009
|
+
|
|
3010
|
+
def _write() -> None:
|
|
3011
|
+
conn = get_connection()
|
|
3012
|
+
row = sql.execute(
|
|
3013
|
+
conn,
|
|
3014
|
+
"SELECT claimed_at FROM smoke_claims "
|
|
3015
|
+
"WHERE work_assignment_id=? AND capability_partition=?",
|
|
3016
|
+
(work_assignment_id, capability_partition),
|
|
3017
|
+
).fetchone()
|
|
3018
|
+
claimed_at = row[0] if row is not None else None
|
|
3019
|
+
deleted = 0
|
|
3020
|
+
try:
|
|
3021
|
+
cur = sql.execute(
|
|
3022
|
+
conn,
|
|
3023
|
+
"DELETE FROM smoke_claims WHERE work_assignment_id=? AND capability_partition=?",
|
|
3024
|
+
(work_assignment_id, capability_partition),
|
|
3025
|
+
)
|
|
3026
|
+
deleted = cur.rowcount or 0
|
|
3027
|
+
conn.commit()
|
|
3028
|
+
except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
|
|
3029
|
+
if deleted and claimed_at is not None:
|
|
3030
|
+
undo_pending_write(
|
|
3031
|
+
conn, exc,
|
|
3032
|
+
undo=lambda: sql.insert_ignore(
|
|
3033
|
+
conn, "smoke_claims",
|
|
3034
|
+
["work_assignment_id", "capability_partition", "claimed_at"],
|
|
3035
|
+
(work_assignment_id, capability_partition, claimed_at),
|
|
3036
|
+
),
|
|
3037
|
+
)
|
|
3038
|
+
raise
|
|
3039
|
+
|
|
3040
|
+
retry_on_locked(_write)
|
|
2899
3041
|
|
|
2900
3042
|
|
|
2901
3043
|
def release_smoke_claim_if_row_is_smoke_leg(assignment_id: str) -> None:
|
|
@@ -2835,6 +2835,124 @@ class TestRollbackAfterDriverError:
|
|
|
2835
2835
|
assert conn.rollbacks == 1
|
|
2836
2836
|
|
|
2837
2837
|
|
|
2838
|
+
class _ExecuteAlwaysFailsConn:
|
|
2839
|
+
"""Wraps a real connection: `cursor().execute()` always raises — stands
|
|
2840
|
+
in for a connection where even the compensating statement
|
|
2841
|
+
`undo_pending_write` issues hits sustained contention, for
|
|
2842
|
+
`TestUndoPendingWrite.test_a_failing_undo_never_masks_the_caught_error`.
|
|
2843
|
+
Deliberately does NOT delegate `cursor()` to the real connection (unlike
|
|
2844
|
+
`tests/test_state.py`'s `_CommitFlakyConn`, which only fakes
|
|
2845
|
+
`commit()`) — every statement this wrapper's cursor is asked to run
|
|
2846
|
+
fails, exactly like `_RollbackRecorder(fail=True)` did for the old
|
|
2847
|
+
unconditional-`conn.rollback()` shape this class replaces."""
|
|
2848
|
+
|
|
2849
|
+
__module__ = "sqlite3" # coord.sql.detect_dialect keys off this
|
|
2850
|
+
|
|
2851
|
+
class _FailingCursor:
|
|
2852
|
+
def execute(self, *_a, **_kw): # noqa: ANN002,ANN003,ANN201
|
|
2853
|
+
raise sqlite3.OperationalError("rollback itself failed")
|
|
2854
|
+
|
|
2855
|
+
def cursor(self): # noqa: ANN201
|
|
2856
|
+
return self._FailingCursor()
|
|
2857
|
+
|
|
2858
|
+
|
|
2859
|
+
class TestUndoPendingWrite:
|
|
2860
|
+
"""#3382 review round 2: `db.undo_pending_write` runs a compensating
|
|
2861
|
+
statement naming THIS write's own row, not any transaction-level undo —
|
|
2862
|
+
neither `conn.rollback()` (round 1) nor `SAVEPOINT` +
|
|
2863
|
+
`ROLLBACK TO SAVEPOINT` (round 2) can express "mine only" on
|
|
2864
|
+
`coord.db`'s shared, process-wide SQLite singleton, which every other
|
|
2865
|
+
`_*_local` writer dispatched through `run_in_threadpool` also writes
|
|
2866
|
+
through. See the function's own docstring for the full incident."""
|
|
2867
|
+
|
|
2868
|
+
def _seed_unrelated_pending_write(self, conn: sqlite3.Connection, key: str) -> None:
|
|
2869
|
+
"""A write pending on *conn*, uncommitted — mirrors another thread's
|
|
2870
|
+
own in-flight statement on the shared singleton."""
|
|
2871
|
+
conn.execute(f"INSERT INTO board_meta (key, value) VALUES ('{key}', 'pending')") # noqa: S608
|
|
2872
|
+
|
|
2873
|
+
def test_undoes_only_this_writes_own_row(
|
|
2874
|
+
self, isolated_conn: sqlite3.Connection,
|
|
2875
|
+
) -> None:
|
|
2876
|
+
"""Both halves of the hazard in one test: an unrelated writer's
|
|
2877
|
+
statement pending BEFORE this write's own (what round 1's bare
|
|
2878
|
+
`conn.rollback()` discarded) *and* one landing AFTER it (what a
|
|
2879
|
+
`ROLLBACK TO SAVEPOINT` would discard, uniquely-named or not — see
|
|
2880
|
+
`test_a_savepoint_scoped_undo_would_discard_a_later_write` below)
|
|
2881
|
+
must both survive, while this write's own row goes."""
|
|
2882
|
+
self._seed_unrelated_pending_write(isolated_conn, "before")
|
|
2883
|
+
isolated_conn.execute(
|
|
2884
|
+
"INSERT INTO board_meta (key, value) VALUES ('ours', 'should-vanish')"
|
|
2885
|
+
)
|
|
2886
|
+
self._seed_unrelated_pending_write(isolated_conn, "after")
|
|
2887
|
+
|
|
2888
|
+
db_mod.undo_pending_write(
|
|
2889
|
+
isolated_conn,
|
|
2890
|
+
sqlite3.OperationalError("database is locked"),
|
|
2891
|
+
undo=lambda: sql.execute(
|
|
2892
|
+
isolated_conn, "DELETE FROM board_meta WHERE key=?", ("ours",)
|
|
2893
|
+
),
|
|
2894
|
+
)
|
|
2895
|
+
|
|
2896
|
+
# Both unrelated pending writes are untouched and still committable
|
|
2897
|
+
# by whoever's writes they actually are.
|
|
2898
|
+
isolated_conn.commit()
|
|
2899
|
+
rows = {
|
|
2900
|
+
r["key"]: r["value"]
|
|
2901
|
+
for r in isolated_conn.execute("SELECT key, value FROM board_meta").fetchall()
|
|
2902
|
+
}
|
|
2903
|
+
assert rows.get("before") == "pending"
|
|
2904
|
+
assert rows.get("after") == "pending"
|
|
2905
|
+
assert "ours" not in rows
|
|
2906
|
+
|
|
2907
|
+
def test_a_savepoint_scoped_undo_would_discard_a_later_write(
|
|
2908
|
+
self, isolated_conn: sqlite3.Connection,
|
|
2909
|
+
) -> None:
|
|
2910
|
+
"""Pins the premise of the design decision above, against the real
|
|
2911
|
+
driver rather than by assertion: `ROLLBACK TO SAVEPOINT` reverts the
|
|
2912
|
+
database to its state just after that savepoint, so it takes every
|
|
2913
|
+
statement issued since with it — including another thread's, and
|
|
2914
|
+
even when each thread uses its OWN distinctly-named savepoint (the
|
|
2915
|
+
round-2 review's suggested fix, which closes only the narrower
|
|
2916
|
+
name-collision half). If SQLite ever changed this, the comment
|
|
2917
|
+
trail in `db.undo_pending_write` would be wrong and this test is how
|
|
2918
|
+
we would find out."""
|
|
2919
|
+
sql.execute(isolated_conn, "SAVEPOINT sp_thread_a")
|
|
2920
|
+
sql.execute(isolated_conn, "SAVEPOINT sp_thread_b") # unique name, still nested
|
|
2921
|
+
isolated_conn.execute("INSERT INTO board_meta (key, value) VALUES ('a', 'x')")
|
|
2922
|
+
isolated_conn.execute("INSERT INTO board_meta (key, value) VALUES ('b', 'x')")
|
|
2923
|
+
|
|
2924
|
+
sql.execute(isolated_conn, "ROLLBACK TO SAVEPOINT sp_thread_a")
|
|
2925
|
+
sql.execute(isolated_conn, "RELEASE SAVEPOINT sp_thread_a")
|
|
2926
|
+
isolated_conn.commit()
|
|
2927
|
+
|
|
2928
|
+
keys = {
|
|
2929
|
+
r["key"] for r in isolated_conn.execute("SELECT key FROM board_meta").fetchall()
|
|
2930
|
+
}
|
|
2931
|
+
assert "a" not in keys
|
|
2932
|
+
assert "b" not in keys, (
|
|
2933
|
+
"thread B's row survived — SQLite's ROLLBACK TO semantics changed, "
|
|
2934
|
+
"and db.undo_pending_write's rationale needs revisiting"
|
|
2935
|
+
)
|
|
2936
|
+
|
|
2937
|
+
def test_none_connection_is_a_no_op(self) -> None:
|
|
2938
|
+
called: list[int] = []
|
|
2939
|
+
db_mod.undo_pending_write(
|
|
2940
|
+
None,
|
|
2941
|
+
sqlite3.OperationalError("database is locked"),
|
|
2942
|
+
undo=lambda: called.append(1),
|
|
2943
|
+
) # must not raise
|
|
2944
|
+
assert called == []
|
|
2945
|
+
|
|
2946
|
+
def test_a_failing_undo_never_masks_the_caught_error(self) -> None:
|
|
2947
|
+
conn = _ExecuteAlwaysFailsConn()
|
|
2948
|
+
|
|
2949
|
+
db_mod.undo_pending_write(
|
|
2950
|
+
conn,
|
|
2951
|
+
sqlite3.OperationalError("database is locked"),
|
|
2952
|
+
undo=lambda: sql.execute(conn, "DELETE FROM board_meta WHERE key=?", ("ours",)),
|
|
2953
|
+
) # must not raise, even though the compensating statement itself fails
|
|
2954
|
+
|
|
2955
|
+
|
|
2838
2956
|
class TestBoardConnectionIfOpen:
|
|
2839
2957
|
"""`retry_on_locked`'s default connection resolution — it must never
|
|
2840
2958
|
*open* one from inside an error handler."""
|