code-coordinator 0.5.489__tar.gz → 0.5.491__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.489 → code_coordinator-0.5.491}/PKG-INFO +1 -1
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/db.py +86 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/diagnose.py +164 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/state.py +30 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/conftest.py +28 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_db.py +71 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_diagnose.py +153 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_state.py +40 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/.gitignore +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/CLAUDE.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/GOAL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/LICENSE +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/MANIFEST.in +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/README.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/__init__.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/agent.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/audit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/backup.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/block_log.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/board_service.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/brain.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/claim.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/claude_setup_token.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/cli.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/client.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/codegen.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/comments.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/config.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dao.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/deps.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dispatch_liveness.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/drive.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/events.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/failure_classifier.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/filelock.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/freshness.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/gates.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/goal.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/context.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/models.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/render.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/health/units.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/hooks.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/interactive.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/invariant_alarms.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/machine_fault.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/models.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/network.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/notify.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/openapi.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/parentage.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/plans.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/progress.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/release_window.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/reports.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/review.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/self_health.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/smoke.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/split_work.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/sql.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/test_author.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/test_report.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/usage.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/install-agent.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/pyproject.toml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/setup.cfg +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/__init__.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/backends.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_claude_setup_token.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_status_invariant_alarms.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_status_machine_fault.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_status_retried_3340.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_client.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_config.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dispatch_liveness.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dispatch_workers.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_drive_machine_fault.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_events.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_failure_classifier.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_fix_escalation_classifier.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_housekeeping.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_init.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_invariant_alarms.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_machine_fault.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_models.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_network.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_cordon_drain_stall_3336.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_retry_escalation_classify_3360.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_review.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_session.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_smoke_fanout_manifest_3333.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_split.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.489 → code_coordinator-0.5.491}/tests/write_parity.py +0 -0
|
@@ -470,6 +470,92 @@ def _is_release_build(version: str) -> bool:
|
|
|
470
470
|
return _RELEASE_VERSION_RE.fullmatch(version) is not None
|
|
471
471
|
|
|
472
472
|
|
|
473
|
+
class _NoActiveTestConnectionSentinel:
|
|
474
|
+
"""Installed as the ``_conn`` singleton whenever pytest is running but no
|
|
475
|
+
test's ``coord_db`` fixture currently holds an active override (#3385).
|
|
476
|
+
|
|
477
|
+
``tests/conftest.py``'s autouse ``coord_db`` fixture is function-scoped:
|
|
478
|
+
it only guarantees an isolated in-memory connection while ONE test's
|
|
479
|
+
setup/call/teardown phases are running. Before this sentinel existed,
|
|
480
|
+
that fixture's teardown called :func:`close`, which resets the module
|
|
481
|
+
singleton to plain ``None`` -- reopening the exact gap #1960's guard was
|
|
482
|
+
built to close, just one layer up: ANY caller of :func:`get_connection`
|
|
483
|
+
during that gap (between one test's teardown finishing and the next
|
|
484
|
+
test's setup starting, or before the very first test's setup has run at
|
|
485
|
+
all) fell through :func:`get_connection` into :func:`_open`, which
|
|
486
|
+
resolves the REAL ``~/.coord/coord.db`` (#1960, #3385). #1960's own guard
|
|
487
|
+
inside :func:`_open` only fires while ``PYTEST_CURRENT_TEST`` happens to
|
|
488
|
+
be set, which is not guaranteed across that specific gap -- exactly the
|
|
489
|
+
seam #3385 was filed to close after #3380's daemon-lifespan-shutdown fix
|
|
490
|
+
left the reported failure count unchanged.
|
|
491
|
+
|
|
492
|
+
Installed once at ``pytest_configure`` (before collection even starts,
|
|
493
|
+
closing the pre-first-test window) and reinstalled by ``coord_db``'s own
|
|
494
|
+
teardown after every test (closing the inter-test window), so ``_conn``
|
|
495
|
+
is never plain ``None`` for the life of a pytest process:
|
|
496
|
+
:func:`get_connection` always hands back either a real per-test override
|
|
497
|
+
or this sentinel -- it can no longer fall through to :func:`_open` while
|
|
498
|
+
pytest is running, regardless of what races ahead of the next test's
|
|
499
|
+
setup or what runs before the first one.
|
|
500
|
+
|
|
501
|
+
Any attempt to use it -- ``.execute()``, ``.cursor()``, ``.commit()``,
|
|
502
|
+
even the ``.closed`` probe :func:`_connection_is_closed` runs on every
|
|
503
|
+
cached connection -- raises :class:`ProductionDatabaseGuardError`
|
|
504
|
+
immediately via ``__getattr__``, so a caller that reaches this gets a
|
|
505
|
+
clear, correctly-attributed error instead of a real database file
|
|
506
|
+
quietly being opened (or silently reused) underneath it.
|
|
507
|
+
|
|
508
|
+
**Scope, stated plainly (#3385 review).** This closes exactly one seam:
|
|
509
|
+
the ``coord.db._conn`` singleton that :func:`get_connection` reads. It
|
|
510
|
+
is a real, previously-unguarded gap, but it is not asserted here to be
|
|
511
|
+
the sole or even primary source of the ~3700
|
|
512
|
+
``ProductionDatabaseGuardError`` failures the issue reports on ``main``
|
|
513
|
+
-- that would require the actual CI failure log, which this fix was not
|
|
514
|
+
verified against (see the commit message for what evidence is, and is
|
|
515
|
+
not, available). One other unguarded route was found by inspection
|
|
516
|
+
while investigating this and is flagged rather than silently left for
|
|
517
|
+
someone else to rediscover: ``coord.dao.SqliteStore._connect()``'s
|
|
518
|
+
SQLite branch opens ``self._path`` (``DB_PATH`` by default,
|
|
519
|
+
resolved once at ``__init__``) with no pytest/non-release guard at all
|
|
520
|
+
-- unlike its Postgres branch, which calls
|
|
521
|
+
``refuse_postgres_under_pytest`` first. ``SqliteStore()`` with no
|
|
522
|
+
explicit ``db_path`` (e.g. ``coord/reports.py``'s
|
|
523
|
+
``_default_usage_rows``) would reach that unguarded path. Left
|
|
524
|
+
unmodified here: it is outside this fix's file scope
|
|
525
|
+
(``tests/conftest.py`` / ``coord/db.py``) and there is no confirmed
|
|
526
|
+
evidence it contributes to the reported count -- but if a post-merge
|
|
527
|
+
``main`` ``Tests`` run still shows a nonzero
|
|
528
|
+
``ProductionDatabaseGuardError`` count after this change, that is the
|
|
529
|
+
next place to look.
|
|
530
|
+
"""
|
|
531
|
+
|
|
532
|
+
def __getattr__(self, name: str) -> Any:
|
|
533
|
+
raise ProductionDatabaseGuardError(
|
|
534
|
+
"coord.db.get_connection() was reached while no test's `coord_db` "
|
|
535
|
+
"fixture held an active override (#3385) -- this is the gap "
|
|
536
|
+
"between one test's teardown and the next test's setup, or "
|
|
537
|
+
"before the very first test's setup has run at all. A caller "
|
|
538
|
+
f"tried to access {name!r} on the connection singleton in that "
|
|
539
|
+
"gap. Likely causes: a background thread a prior test spawned "
|
|
540
|
+
"and never joined, or a fixture that reaches coord.db before "
|
|
541
|
+
"the autouse `coord_db` fixture has installed its override. See "
|
|
542
|
+
"#1960 (the guard this generalizes) and #3385 (this sentinel)."
|
|
543
|
+
)
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
def _pytest_gap_sentinel() -> Any:
|
|
547
|
+
"""Factory for :class:`_NoActiveTestConnectionSentinel` (#3385).
|
|
548
|
+
|
|
549
|
+
A function rather than a bare module-level instance so every install
|
|
550
|
+
site (``tests/conftest.py``'s ``pytest_configure`` and ``coord_db``
|
|
551
|
+
teardown) gets its own object -- cheap, and it means a traceback's
|
|
552
|
+
``id()`` never accidentally suggests two installs shared state they
|
|
553
|
+
don't (the sentinel is stateless, but nothing here should rely on that
|
|
554
|
+
by sharing one instance).
|
|
555
|
+
"""
|
|
556
|
+
return _NoActiveTestConnectionSentinel()
|
|
557
|
+
|
|
558
|
+
|
|
473
559
|
def override_connection(conn: Any) -> None:
|
|
474
560
|
"""Replace the singleton connection. Used in tests to inject :memory: DBs.
|
|
475
561
|
|
|
@@ -735,6 +735,22 @@ def diagnose_stage(
|
|
|
735
735
|
latest = _latest(assignments)
|
|
736
736
|
|
|
737
737
|
if latest is None:
|
|
738
|
+
# #3383: a `review_claims` row held for a work assignment with ZERO
|
|
739
|
+
# review/test-author/mock-author rows (never dispatched, or all
|
|
740
|
+
# deleted) is unreachable from `_recover_review` below — that
|
|
741
|
+
# function only ever runs once `latest` above is non-None. Before
|
|
742
|
+
# this, `--stage review` hit this exact branch and reported the
|
|
743
|
+
# stage healthy while `dispatch_review` was permanently wedged
|
|
744
|
+
# behind the leaked claim (#3206's failure one state earlier — see
|
|
745
|
+
# `_leaked_review_claim_without_row`'s docstring). Checked BEFORE
|
|
746
|
+
# the "no review assignment" finding below, on claim state rather
|
|
747
|
+
# than on row existence, exactly as #3206 already does once a row
|
|
748
|
+
# exists.
|
|
749
|
+
if stage == "review" and _leaked_review_claim_without_row(
|
|
750
|
+
board, repo_name, issue_number, res, reset=reset, dry_run=dry_run,
|
|
751
|
+
):
|
|
752
|
+
_cleanup_issue(board, config, repo_name, issue_number, res, dry_run=dry_run, reset=reset)
|
|
753
|
+
return res
|
|
738
754
|
res.findings.append(f"no {stage} assignment on the board for #{issue_number}")
|
|
739
755
|
res.recovered = True # nothing wedged
|
|
740
756
|
# Still run the issue-wide cleanup below.
|
|
@@ -818,6 +834,154 @@ def diagnose_stage(
|
|
|
818
834
|
return res
|
|
819
835
|
|
|
820
836
|
|
|
837
|
+
# #3383: a claim taken by `claim_review_dispatch` shortly before its caller
|
|
838
|
+
# inserts the review row it's claiming for looks, from a single read,
|
|
839
|
+
# identical to a genuinely leaked claim — the same false-positive window
|
|
840
|
+
# `_recover_review` below already documents for the terminal-row case
|
|
841
|
+
# (#3206). Below this age the claim is reported but NOT offered for release;
|
|
842
|
+
# above it, treated as leaked.
|
|
843
|
+
#
|
|
844
|
+
# NOT short on purpose — `dispatch_review` (coord/review.py) claims at
|
|
845
|
+
# `claim_review_dispatch` (~line 3070) and does NOT insert the review's
|
|
846
|
+
# `assignments` row until `record_dispatched_assignment` (~line 3763); its
|
|
847
|
+
# own `except Exception` handler at ~line 3815 calls the ~500 lines between
|
|
848
|
+
# those two points "pr_lookup, briefing assembly, JSON handling of
|
|
849
|
+
# agent_response, ...". That gap includes several sequential GitHub API
|
|
850
|
+
# calls (`work_is_terminal`, `branch_commits_ahead`, `pr_lookup`,
|
|
851
|
+
# `branch_exists_on_remote`, `pr_diff`, `get_compare_files`,
|
|
852
|
+
# `get_compare_diff`, `get_pr_commit_messages`, an issue-body fetch) and then
|
|
853
|
+
# a candidate loop that POSTs to each reviewer machine's `/assign` with
|
|
854
|
+
# `timeout=ASSIGN_POST_TIMEOUT_SECS` (`coord/dispatch.py` — 60.0s),
|
|
855
|
+
# falling through to the next candidate on rejection/timeout/unreachability.
|
|
856
|
+
# A single slow/unreachable first-choice reviewer machine alone can burn the
|
|
857
|
+
# full 60s before a second candidate is even tried, and there is no hard cap
|
|
858
|
+
# on candidate count — so this has to clear that whole chain, not one
|
|
859
|
+
# network round trip. Picked as a small multiple of minutes so it
|
|
860
|
+
# comfortably outlasts a worst-case multi-candidate dispatch plus GitHub API
|
|
861
|
+
# latency, while still being short enough that a *genuinely* leaked claim
|
|
862
|
+
# doesn't sit unrecoverable for long once someone runs `--reset`.
|
|
863
|
+
_REVIEW_CLAIM_LEAK_GRACE_SECS = 600.0
|
|
864
|
+
|
|
865
|
+
|
|
866
|
+
def _leaked_review_claim_without_row(
|
|
867
|
+
board: "Board",
|
|
868
|
+
repo_name: str,
|
|
869
|
+
issue_number: int,
|
|
870
|
+
res: DiagnoseResult,
|
|
871
|
+
*,
|
|
872
|
+
reset: bool,
|
|
873
|
+
dry_run: bool,
|
|
874
|
+
) -> bool:
|
|
875
|
+
"""#3383: detect (and, under ``--reset``, release) a leaked
|
|
876
|
+
``review_claims`` row for a work assignment that has NO review /
|
|
877
|
+
test-author / mock-author row at all — the one shape `_recover_review`
|
|
878
|
+
can never see, because `diagnose_stage` only calls it once
|
|
879
|
+
`stage_assignments(..., "review")` finds a row. A claim can be (and, per
|
|
880
|
+
the issue that reported this, was) taken and never released when the
|
|
881
|
+
work assignment it's keyed on was dispatched to review, that review
|
|
882
|
+
never got as far as inserting its own `assignments` row (or its row was
|
|
883
|
+
later deleted, e.g. by an earlier `--reset`), and the claim outlived it.
|
|
884
|
+
Every future `dispatch_review` for that work assignment then denies
|
|
885
|
+
forever with the misleading #3113 "lost the atomic dispatch-claim race"
|
|
886
|
+
reason — while `coord diagnose --stage review` (which hit the
|
|
887
|
+
`latest is None` "no review assignment" branch before this function
|
|
888
|
+
existed) reported the stage healthy.
|
|
889
|
+
|
|
890
|
+
Checked against the WORK assignment's id — `claim_review_dispatch` is
|
|
891
|
+
keyed on the id of the assignment BEING reviewed, never on a review
|
|
892
|
+
row's own id (see `_recover_review`'s `work_assignment_id` resolution).
|
|
893
|
+
|
|
894
|
+
Returns ``True`` when a claim was found (whether or not it could be
|
|
895
|
+
released yet — see the grace-period case) and this function has already
|
|
896
|
+
appended the appropriate finding(s); ``False`` when there is nothing to
|
|
897
|
+
report, in which case the caller's own "no review assignment" message
|
|
898
|
+
is the correct (healthy) diagnosis.
|
|
899
|
+
"""
|
|
900
|
+
from coord.state import ( # noqa: PLC0415
|
|
901
|
+
has_review_claim,
|
|
902
|
+
release_review_dispatch_claim,
|
|
903
|
+
review_claim_age_secs,
|
|
904
|
+
)
|
|
905
|
+
|
|
906
|
+
# Narrowing, acknowledged: this only checks the NEWEST `work`-type row
|
|
907
|
+
# for the issue, whereas `claim_review_dispatch` is keyed on whatever
|
|
908
|
+
# work-assignment id `dispatch_review` was actually called with. If the
|
|
909
|
+
# issue ever accumulates more than one `work` row (e.g. a rework/retry
|
|
910
|
+
# dispatched after the original work assignment that leaked the claim),
|
|
911
|
+
# a claim held on the *older* id is invisible here because this checks
|
|
912
|
+
# only the *newest* one. `_recover_review` avoids this by reading the
|
|
913
|
+
# exact id off the review row's own `review_of_assignment_id` FK — there
|
|
914
|
+
# is no review row here to read that FK from, so this has to guess.
|
|
915
|
+
# Probably rare, and the issue's own "worth also considering" `coord
|
|
916
|
+
# doctor` suggestion is the more complete fix; left as a known gap
|
|
917
|
+
# rather than iterating over every `work` row here.
|
|
918
|
+
work_rows = stage_assignments(board, repo_name, issue_number, "work")
|
|
919
|
+
work_latest = _latest(work_rows)
|
|
920
|
+
if work_latest is None or not work_latest.assignment_id:
|
|
921
|
+
return False
|
|
922
|
+
work_assignment_id = work_latest.assignment_id
|
|
923
|
+
if not has_review_claim(work_assignment_id):
|
|
924
|
+
return False
|
|
925
|
+
|
|
926
|
+
age = review_claim_age_secs(work_assignment_id)
|
|
927
|
+
if age is not None and age < _REVIEW_CLAIM_LEAK_GRACE_SECS:
|
|
928
|
+
# Too fresh to distinguish from an in-flight `dispatch_review` call
|
|
929
|
+
# that has taken the claim but not yet inserted its review row —
|
|
930
|
+
# report it, but don't offer to release something that might still
|
|
931
|
+
# be a live, wanted dispatch.
|
|
932
|
+
res.findings.append(
|
|
933
|
+
f"work assignment {work_assignment_id} holds a review-dispatch "
|
|
934
|
+
f"claim taken {age:.1f}s ago with no review row yet — likely an "
|
|
935
|
+
"in-flight dispatch_review, not a leak; re-run diagnose again "
|
|
936
|
+
"shortly if this persists"
|
|
937
|
+
)
|
|
938
|
+
res.recovered = True
|
|
939
|
+
return True
|
|
940
|
+
|
|
941
|
+
res.findings.append(
|
|
942
|
+
f"no review assignment exists for #{issue_number}, but work "
|
|
943
|
+
f"assignment {work_assignment_id} still holds a review-dispatch "
|
|
944
|
+
"claim (leaked review_claims row, #3383 — the #3206 class one state "
|
|
945
|
+
"earlier) — every future dispatch_review for this work assignment "
|
|
946
|
+
"will deny with the misleading #3113 'lost the atomic dispatch-claim "
|
|
947
|
+
"race' reason until it is released. Re-run with --reset to release it."
|
|
948
|
+
)
|
|
949
|
+
res.recovered = False
|
|
950
|
+
res.needs_reset = True
|
|
951
|
+
|
|
952
|
+
if reset:
|
|
953
|
+
if dry_run:
|
|
954
|
+
res.findings.append(
|
|
955
|
+
"(dry-run) would release the leaked review-dispatch claim"
|
|
956
|
+
)
|
|
957
|
+
return True
|
|
958
|
+
release_review_dispatch_claim(work_assignment_id)
|
|
959
|
+
if has_review_claim(work_assignment_id):
|
|
960
|
+
res.findings.append(
|
|
961
|
+
f"release requested for {work_assignment_id}'s "
|
|
962
|
+
"review-dispatch claim, but it is still present on re-read "
|
|
963
|
+
"— the release did NOT persist"
|
|
964
|
+
)
|
|
965
|
+
else:
|
|
966
|
+
res.actions_taken.append(
|
|
967
|
+
"released leaked review-dispatch claim for work assignment "
|
|
968
|
+
f"{work_assignment_id} — dispatch_review is now re-dispatchable"
|
|
969
|
+
)
|
|
970
|
+
res.reset_performed = True
|
|
971
|
+
res.recovered = True
|
|
972
|
+
res.branch_preserved = True
|
|
973
|
+
# Matches `_do_reset`'s (#3206) convention: a successful release
|
|
974
|
+
# must clear the `needs_reset=True` set a few lines above, or
|
|
975
|
+
# `to_json_dict()` — documented as read by the TUI without
|
|
976
|
+
# scraping human-readable lines — carries the internally
|
|
977
|
+
# contradictory `recovered=true needs_reset=true
|
|
978
|
+
# reset_performed=true` even though the plain-text CLI's "still
|
|
979
|
+
# wedged" warning happens to be gated on `not reset` and so never
|
|
980
|
+
# shows it.
|
|
981
|
+
res.needs_reset = False
|
|
982
|
+
return True
|
|
983
|
+
|
|
984
|
+
|
|
821
985
|
def _recover_review(
|
|
822
986
|
board, config, latest, state, res: DiagnoseResult, *, dry_run: bool
|
|
823
987
|
) -> None:
|
|
@@ -2388,6 +2388,36 @@ def has_review_claim(of_assignment_id: str) -> bool:
|
|
|
2388
2388
|
return row is not None
|
|
2389
2389
|
|
|
2390
2390
|
|
|
2391
|
+
def review_claim_age_secs(of_assignment_id: str) -> float | None:
|
|
2392
|
+
"""Seconds since *of_assignment_id*'s ``review_claims`` row was taken, or
|
|
2393
|
+
``None`` when no claim is held (#3383).
|
|
2394
|
+
|
|
2395
|
+
Sibling read to :func:`has_review_claim`, used by ``coord diagnose
|
|
2396
|
+
--stage review`` to gate a claim release on age: a claim taken
|
|
2397
|
+
microseconds ago by an in-flight :func:`claim_review_dispatch` call that
|
|
2398
|
+
has not yet inserted its review ``assignments`` row is indistinguishable,
|
|
2399
|
+
from a single read, from a genuinely leaked claim — exactly the
|
|
2400
|
+
false-positive window already documented on the terminal-review-row path
|
|
2401
|
+
in ``diagnose._recover_review`` (#3206). Comparing ``claimed_at`` against
|
|
2402
|
+
a short grace period lets the caller tell "just claimed, dispatch still
|
|
2403
|
+
running" apart from "claimed a long time ago, nothing is coming".
|
|
2404
|
+
|
|
2405
|
+
Same local-DB-only caveat as :func:`has_review_claim` — reads the local
|
|
2406
|
+
connection, not the daemon, so it undercounts on a thin client.
|
|
2407
|
+
"""
|
|
2408
|
+
if not of_assignment_id:
|
|
2409
|
+
return None
|
|
2410
|
+
conn = get_connection()
|
|
2411
|
+
row = sql.execute(
|
|
2412
|
+
conn,
|
|
2413
|
+
"SELECT claimed_at FROM review_claims WHERE of_assignment_id=?",
|
|
2414
|
+
(of_assignment_id,),
|
|
2415
|
+
).fetchone()
|
|
2416
|
+
if row is None or row[0] is None:
|
|
2417
|
+
return None
|
|
2418
|
+
return time.time() - row[0]
|
|
2419
|
+
|
|
2420
|
+
|
|
2391
2421
|
def release_review_dispatch_claim(of_assignment_id: str) -> None:
|
|
2392
2422
|
"""Release a claim taken by :func:`claim_review_dispatch`.
|
|
2393
2423
|
|
|
@@ -87,11 +87,27 @@ def pytest_configure(config):
|
|
|
87
87
|
|
|
88
88
|
A no-op on the default SQLite path: it neither imports a driver nor opens
|
|
89
89
|
a socket, so a plain ``pytest`` is unaffected.
|
|
90
|
+
|
|
91
|
+
#3385: also installs ``coord.db``'s pytest-gap sentinel as the initial
|
|
92
|
+
connection singleton, before collection (and therefore every test
|
|
93
|
+
module's import-time code) ever runs. See
|
|
94
|
+
:func:`coord.db._pytest_gap_sentinel` for what this closes: without it,
|
|
95
|
+
``coord.db._conn`` starts life as plain ``None`` and stays that way until
|
|
96
|
+
the FIRST test's autouse ``coord_db`` fixture installs its override --
|
|
97
|
+
anything that calls ``coord.db.get_connection()`` before that point (e.g.
|
|
98
|
+
module-level code a test file runs at import/collection time) could fall
|
|
99
|
+
through to the real ``~/.coord/coord.db``. Installing the sentinel here
|
|
100
|
+
closes that window the same way ``coord_db``'s own teardown closes the
|
|
101
|
+
inter-test one.
|
|
90
102
|
"""
|
|
91
103
|
from tests.backends import preflight
|
|
92
104
|
|
|
93
105
|
preflight()
|
|
94
106
|
|
|
107
|
+
from coord import db as db_mod
|
|
108
|
+
|
|
109
|
+
db_mod.override_connection(db_mod._pytest_gap_sentinel())
|
|
110
|
+
|
|
95
111
|
|
|
96
112
|
@pytest.fixture(autouse=True)
|
|
97
113
|
def _non_terminal_work(monkeypatch):
|
|
@@ -1111,6 +1127,18 @@ def coord_db():
|
|
|
1111
1127
|
# already-closed connection is a no-op on both drivers).
|
|
1112
1128
|
session.close()
|
|
1113
1129
|
db.close()
|
|
1130
|
+
# #3385: `db.close()` just reset the singleton to plain `None` --
|
|
1131
|
+
# reopening the gap #1960's guard exists to close, one layer up.
|
|
1132
|
+
# Anything that calls `coord.db.get_connection()` between THIS
|
|
1133
|
+
# test's teardown finishing and the NEXT test's `coord_db` setup
|
|
1134
|
+
# installing its own override (a background thread a prior test
|
|
1135
|
+
# spawned and never joined, a fixture that reaches coord.db before
|
|
1136
|
+
# this one runs) would otherwise fall through to `_open()` and could
|
|
1137
|
+
# reach the real `~/.coord/coord.db`. Installing the sentinel here
|
|
1138
|
+
# closes that window; the next test's `coord_db` setup overwrites it
|
|
1139
|
+
# with a fresh real override before that test's body ever runs, same
|
|
1140
|
+
# as always.
|
|
1141
|
+
db.override_connection(db._pytest_gap_sentinel())
|
|
1114
1142
|
|
|
1115
1143
|
|
|
1116
1144
|
# Every module-attribute name that coord.db / coord.state / coord.config /
|
|
@@ -1100,6 +1100,77 @@ class TestOverrideConnection:
|
|
|
1100
1100
|
_ensure_schema(sqlite3.connect(":memory:"))
|
|
1101
1101
|
|
|
1102
1102
|
|
|
1103
|
+
# ── pytest-gap sentinel (#3385) ──────────────────────────────────────────────
|
|
1104
|
+
#
|
|
1105
|
+
# #3385: `main`'s `Tests` workflow was red for 33 days with thousands of
|
|
1106
|
+
# `ProductionDatabaseGuardError`s, and #3380's daemon-lifespan-shutdown fix
|
|
1107
|
+
# left the count unchanged -- because the actual gap is in `coord.db`'s
|
|
1108
|
+
# connection singleton itself, not the daemon: `tests/conftest.py`'s autouse
|
|
1109
|
+
# `coord_db` fixture only guarantees an isolated override while ONE test's
|
|
1110
|
+
# own setup/call/teardown phases are running. Its teardown used to call
|
|
1111
|
+
# `close()`, which resets `_conn` to plain `None` -- reopening the #1960 gap
|
|
1112
|
+
# one layer up for anything that calls `get_connection()` in the window
|
|
1113
|
+
# between one test's teardown and the next test's setup, or before the very
|
|
1114
|
+
# first test's setup has run at all. #1960's own `PYTEST_CURRENT_TEST` guard
|
|
1115
|
+
# inside `_open()` only protects that window if the env var happens to still
|
|
1116
|
+
# be set at that exact moment, which is not guaranteed. `_pytest_gap_
|
|
1117
|
+
# sentinel()` (installed by both `pytest_configure` and `coord_db`'s
|
|
1118
|
+
# teardown in `tests/conftest.py`) closes it unconditionally: `_conn` is
|
|
1119
|
+
# never plain `None` for the life of a pytest process, so `get_connection()`
|
|
1120
|
+
# can no longer fall through to `_open()` -- and therefore the real
|
|
1121
|
+
# `~/.coord/coord.db` -- while pytest is running, regardless of timing.
|
|
1122
|
+
class TestPytestGapSentinel:
|
|
1123
|
+
def test_any_attribute_access_raises_the_guard(self) -> None:
|
|
1124
|
+
sentinel = db_mod._pytest_gap_sentinel()
|
|
1125
|
+
with pytest.raises(db_mod.ProductionDatabaseGuardError, match="coord_db"):
|
|
1126
|
+
sentinel.execute("SELECT 1")
|
|
1127
|
+
|
|
1128
|
+
def test_probing_closed_also_raises(self) -> None:
|
|
1129
|
+
"""`_connection_is_closed` -- the first thing `get_connection()` does
|
|
1130
|
+
with a cached connection -- reads `.closed` via
|
|
1131
|
+
`getattr(conn, "closed", False)`. The sentinel must not silently
|
|
1132
|
+
answer "not closed" here: that would let `get_connection()` hand the
|
|
1133
|
+
sentinel back as if it were a usable connection, deferring the
|
|
1134
|
+
failure to whatever statement runs next instead of raising at the
|
|
1135
|
+
point the gap was actually reached."""
|
|
1136
|
+
sentinel = db_mod._pytest_gap_sentinel()
|
|
1137
|
+
with pytest.raises(db_mod.ProductionDatabaseGuardError):
|
|
1138
|
+
db_mod._connection_is_closed(sentinel)
|
|
1139
|
+
|
|
1140
|
+
def test_get_connection_raises_instead_of_opening_the_real_path(self) -> None:
|
|
1141
|
+
"""Simulates the exact gap #3385 closes: `_conn` holding the
|
|
1142
|
+
sentinel, as `coord_db`'s teardown (and `pytest_configure`, before
|
|
1143
|
+
the first test) now leave it, instead of plain `None`.
|
|
1144
|
+
|
|
1145
|
+
RED against the pre-#3385 shape (installing plain `None` here
|
|
1146
|
+
instead): `get_connection()` would fall through to `_open()`, whose
|
|
1147
|
+
only protection is whether `PYTEST_CURRENT_TEST` happens to be set at
|
|
1148
|
+
that exact moment -- true during this test's own body, so it would
|
|
1149
|
+
incidentally still raise here, just via a DIFFERENT code path (and
|
|
1150
|
+
not at all in the actual gap this issue is about, between two tests,
|
|
1151
|
+
which this single-test assertion cannot reach). GREEN here
|
|
1152
|
+
demonstrates the sentinel raises unconditionally, before `_open()`
|
|
1153
|
+
-- and therefore the real `~/.coord/coord.db` -- is ever reached,
|
|
1154
|
+
which is what actually closes the inter-test gap.
|
|
1155
|
+
|
|
1156
|
+
Restores the real per-test connection in a ``finally`` rather than
|
|
1157
|
+
via ``monkeypatch``: an earlier autouse fixture in
|
|
1158
|
+
``tests/conftest.py`` already pulls the shared ``monkeypatch``
|
|
1159
|
+
instance's setup forward ahead of ``coord_db`` (see
|
|
1160
|
+
``_no_frozen_coord_dir_constants``'s docstring), which pushes
|
|
1161
|
+
``monkeypatch``'s own undo to AFTER ``coord_db``'s teardown -- so a
|
|
1162
|
+
``monkeypatch.setattr`` here would leave the sentinel installed when
|
|
1163
|
+
``coord_db``'s teardown tries to ``close()`` it.
|
|
1164
|
+
"""
|
|
1165
|
+
original_conn = db_mod._conn
|
|
1166
|
+
db_mod.override_connection(db_mod._pytest_gap_sentinel())
|
|
1167
|
+
try:
|
|
1168
|
+
with pytest.raises(db_mod.ProductionDatabaseGuardError, match="coord_db"):
|
|
1169
|
+
db_mod.get_connection()
|
|
1170
|
+
finally:
|
|
1171
|
+
db_mod.override_connection(original_conn)
|
|
1172
|
+
|
|
1173
|
+
|
|
1103
1174
|
# ── _resolve_store_target (#827) ─────────────────────────────────────────────
|
|
1104
1175
|
|
|
1105
1176
|
_VALID_REPOS_MACHINES_YAML = (
|
|
@@ -1220,6 +1220,24 @@ def _record(a: Assignment) -> None:
|
|
|
1220
1220
|
conn.commit()
|
|
1221
1221
|
|
|
1222
1222
|
|
|
1223
|
+
def _backdate_review_claim(of_assignment_id: str, *, seconds_ago: float) -> None:
|
|
1224
|
+
"""Push a `review_claims` row's `claimed_at` into the past — used to put
|
|
1225
|
+
a claim outside #3383's grace period (real claims in these tests are
|
|
1226
|
+
taken via `state.claim_review_dispatch`, which stamps `time.time()`;
|
|
1227
|
+
without this every test claim looks "just taken", which is exactly the
|
|
1228
|
+
fresh-claim case the grace period is meant to protect)."""
|
|
1229
|
+
import time as _time
|
|
1230
|
+
|
|
1231
|
+
from coord.db import get_connection
|
|
1232
|
+
|
|
1233
|
+
conn = get_connection()
|
|
1234
|
+
conn.execute(
|
|
1235
|
+
"UPDATE review_claims SET claimed_at=? WHERE of_assignment_id=?",
|
|
1236
|
+
(_time.time() - seconds_ago, of_assignment_id),
|
|
1237
|
+
)
|
|
1238
|
+
conn.commit()
|
|
1239
|
+
|
|
1240
|
+
|
|
1223
1241
|
def test_reset_review_real_db_deletes_review_when_latest_is_the_review_row(
|
|
1224
1242
|
monkeypatch, config, coord_db
|
|
1225
1243
|
) -> None:
|
|
@@ -1381,6 +1399,141 @@ def test_diagnose_review_healthy_when_no_claim_leaked(
|
|
|
1381
1399
|
assert any("healthy" in f for f in res.findings)
|
|
1382
1400
|
|
|
1383
1401
|
|
|
1402
|
+
def test_diagnose_review_detects_leaked_claim_with_no_review_rows(
|
|
1403
|
+
monkeypatch, config, coord_db
|
|
1404
|
+
) -> None:
|
|
1405
|
+
"""#3383 regression: a `review_claims` row held for a work assignment
|
|
1406
|
+
that has NO review/test-author/mock-author row AT ALL (the state one
|
|
1407
|
+
step earlier than #3206's terminal-row case) used to be unreachable —
|
|
1408
|
+
`stage_assignments(..., "review")` finds nothing, `latest is None`, and
|
|
1409
|
+
`diagnose_stage` took the "no review assignment on the board" early
|
|
1410
|
+
return before ever calling `_recover_review` (which is the only place
|
|
1411
|
+
that cross-checked `review_claims`). This left the claim permanently
|
|
1412
|
+
wedged with `coord diagnose --stage review --reset` reporting the stage
|
|
1413
|
+
healthy AND doing nothing. This reproduces against unfixed `main`: the
|
|
1414
|
+
old early return set `recovered=True` unconditionally with no claim
|
|
1415
|
+
check at all.
|
|
1416
|
+
"""
|
|
1417
|
+
from coord import state
|
|
1418
|
+
|
|
1419
|
+
_stub(monkeypatch, session="dead")
|
|
1420
|
+
_record(_assign(
|
|
1421
|
+
aid="w1", typ="work", status="done", review_state="dispatched",
|
|
1422
|
+
dispatched_at=100.0,
|
|
1423
|
+
))
|
|
1424
|
+
# Simulate the leak: a claim was taken (e.g. by a `dispatch_review` call
|
|
1425
|
+
# whose review row never landed, or was later deleted) and never
|
|
1426
|
+
# released — no review row exists to cross-check it against. Backdated
|
|
1427
|
+
# well past the #3383 grace period so it isn't mistaken for a claim an
|
|
1428
|
+
# in-flight `dispatch_review` just took (see the fresh-claim test below).
|
|
1429
|
+
assert state.claim_review_dispatch("w1") is True
|
|
1430
|
+
_backdate_review_claim("w1", seconds_ago=3600.0)
|
|
1431
|
+
|
|
1432
|
+
board = Board(completed=[_assign(aid="w1", typ="work", status="done", dispatched_at=100.0)])
|
|
1433
|
+
|
|
1434
|
+
res = diagnose.diagnose_stage(board, config, "api", 42, "review", dry_run=True)
|
|
1435
|
+
|
|
1436
|
+
assert res.recovered is False
|
|
1437
|
+
assert res.needs_reset is True
|
|
1438
|
+
assert any("review_claims" in f or "review-dispatch claim" in f for f in res.findings)
|
|
1439
|
+
# A dry-run must not touch the claim.
|
|
1440
|
+
assert state.claim_review_dispatch("w1") is False
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
def test_reset_review_releases_leaked_claim_with_no_review_rows(
|
|
1444
|
+
monkeypatch, config, coord_db
|
|
1445
|
+
) -> None:
|
|
1446
|
+
"""#3383: `--reset` must actually clear the leaked claim detected above
|
|
1447
|
+
so `coord review <work-assignment-id>` becomes dispatchable again — the
|
|
1448
|
+
whole point of the issue (there was previously NO operator CLI path at
|
|
1449
|
+
all to clear this)."""
|
|
1450
|
+
from coord import state
|
|
1451
|
+
|
|
1452
|
+
_stub(monkeypatch, session="dead")
|
|
1453
|
+
_record(_assign(
|
|
1454
|
+
aid="w1", typ="work", status="done", review_state="dispatched",
|
|
1455
|
+
dispatched_at=100.0,
|
|
1456
|
+
))
|
|
1457
|
+
assert state.claim_review_dispatch("w1") is True
|
|
1458
|
+
_backdate_review_claim("w1", seconds_ago=3600.0)
|
|
1459
|
+
|
|
1460
|
+
board = Board(completed=[_assign(aid="w1", typ="work", status="done", dispatched_at=100.0)])
|
|
1461
|
+
|
|
1462
|
+
res = diagnose.diagnose_stage(board, config, "api", 42, "review", reset=True)
|
|
1463
|
+
|
|
1464
|
+
assert res.reset_performed is True
|
|
1465
|
+
assert res.recovered is True
|
|
1466
|
+
# The claim is gone — a fresh claim attempt for "w1" must succeed again,
|
|
1467
|
+
# exactly like `dispatch_review` would need for a real re-dispatch.
|
|
1468
|
+
assert state.claim_review_dispatch("w1") is True
|
|
1469
|
+
|
|
1470
|
+
|
|
1471
|
+
def test_reset_review_reports_leaked_claim_delete_failure_when_row_survives(
|
|
1472
|
+
monkeypatch, config, coord_db
|
|
1473
|
+
) -> None:
|
|
1474
|
+
"""#3383 non-blocking review gap: `_leaked_review_claim_without_row`'s
|
|
1475
|
+
own release path has the same "trust the write, not a re-read" risk that
|
|
1476
|
+
`_do_reset`'s analogous #3206 terminal-row path already guards against
|
|
1477
|
+
(see `test_reset_review_reports_delete_failure_when_row_survives`
|
|
1478
|
+
above) — but nothing exercised it for this no-review-row shape. Simulate
|
|
1479
|
+
`release_review_dispatch_claim` reporting success while the claim is
|
|
1480
|
+
still present on re-read (mirrors the coord-tui#49 non-persisting write)
|
|
1481
|
+
and assert the action line is honest about it rather than claiming the
|
|
1482
|
+
claim is gone."""
|
|
1483
|
+
from coord import state
|
|
1484
|
+
|
|
1485
|
+
_stub(monkeypatch, session="dead")
|
|
1486
|
+
_record(_assign(
|
|
1487
|
+
aid="w1", typ="work", status="done", review_state="dispatched",
|
|
1488
|
+
dispatched_at=100.0,
|
|
1489
|
+
))
|
|
1490
|
+
assert state.claim_review_dispatch("w1") is True
|
|
1491
|
+
_backdate_review_claim("w1", seconds_ago=3600.0)
|
|
1492
|
+
|
|
1493
|
+
# Simulate a release call that reports success but never actually
|
|
1494
|
+
# removes the row — `has_review_claim` still finds it on re-read.
|
|
1495
|
+
monkeypatch.setattr(state, "release_review_dispatch_claim", lambda *a, **k: None)
|
|
1496
|
+
|
|
1497
|
+
board = Board(completed=[_assign(aid="w1", typ="work", status="done", dispatched_at=100.0)])
|
|
1498
|
+
|
|
1499
|
+
res = diagnose.diagnose_stage(board, config, "api", 42, "review", reset=True)
|
|
1500
|
+
|
|
1501
|
+
assert res.reset_performed is False
|
|
1502
|
+
assert res.recovered is False
|
|
1503
|
+
assert res.needs_reset is True
|
|
1504
|
+
assert any(
|
|
1505
|
+
"did NOT persist" in f
|
|
1506
|
+
for f in res.findings
|
|
1507
|
+
)
|
|
1508
|
+
# Still held — the release never actually took.
|
|
1509
|
+
assert state.claim_review_dispatch("w1") is False
|
|
1510
|
+
|
|
1511
|
+
|
|
1512
|
+
def test_diagnose_review_fresh_claim_without_row_not_treated_as_leaked(
|
|
1513
|
+
monkeypatch, config, coord_db
|
|
1514
|
+
) -> None:
|
|
1515
|
+
"""Sibling of the two tests above: a claim taken only moments ago, with
|
|
1516
|
+
no review row yet, is indistinguishable from an in-flight
|
|
1517
|
+
`dispatch_review` call that has claimed but not yet inserted its review
|
|
1518
|
+
row — the same false-positive window `_recover_review` already
|
|
1519
|
+
documents for the terminal-row case (#3206), one state earlier. Must be
|
|
1520
|
+
reported but NOT offered for release while this fresh."""
|
|
1521
|
+
from coord import state
|
|
1522
|
+
|
|
1523
|
+
_stub(monkeypatch, session="dead")
|
|
1524
|
+
_record(_assign(aid="w1", typ="work", status="done", dispatched_at=100.0))
|
|
1525
|
+
assert state.claim_review_dispatch("w1") is True # claimed "just now"
|
|
1526
|
+
|
|
1527
|
+
board = Board(completed=[_assign(aid="w1", typ="work", status="done", dispatched_at=100.0)])
|
|
1528
|
+
|
|
1529
|
+
res = diagnose.diagnose_stage(board, config, "api", 42, "review", dry_run=True)
|
|
1530
|
+
|
|
1531
|
+
assert res.needs_reset is False
|
|
1532
|
+
assert any("in-flight dispatch_review" in f for f in res.findings)
|
|
1533
|
+
# Untouched — still held.
|
|
1534
|
+
assert state.claim_review_dispatch("w1") is False
|
|
1535
|
+
|
|
1536
|
+
|
|
1384
1537
|
def test_reset_review_reports_delete_failure_when_row_survives(
|
|
1385
1538
|
monkeypatch, config, coord_db
|
|
1386
1539
|
) -> None:
|