code-coordinator 0.5.452__tar.gz → 0.5.453__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.452 → code_coordinator-0.5.453}/PKG-INFO +1 -1
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dao.py +96 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/fleet_board.py +24 -1
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/fleet_snapshot.py +31 -3
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/serve_app.py +75 -17
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/sql.py +36 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_read_path.py +77 -3
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_sql_dialect.py +58 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_sqlite_connect_ratchet.py +19 -5
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_store_contract.py +15 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.gitignore +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/CLAUDE.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/GOAL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/LICENSE +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/MANIFEST.in +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/README.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/__init__.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agent.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/audit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/backup.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/block_log.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/board_service.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/brain.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/claim.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/cli.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/client.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/codegen.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/comments.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/config.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/db.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deps.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/drive.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/events.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/filelock.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/freshness.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/gates.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/goal.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/context.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/models.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/render.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/units.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/hooks.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/interactive.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/models.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/network.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notify.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/openapi.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/parentage.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/plans.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/progress.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/release_window.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/reports.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/review.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/self_health.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/smoke.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/split_work.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/state.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/test_author.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/test_report.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/usage.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/install-agent.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/pyproject.toml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/setup.cfg +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/__init__.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/backends.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/conftest.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_client.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_db.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_events.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_init.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_models.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_network.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_session.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_split.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_state.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/write_parity.py +0 -0
|
@@ -78,6 +78,7 @@ from __future__ import annotations
|
|
|
78
78
|
import json
|
|
79
79
|
import os
|
|
80
80
|
import sqlite3
|
|
81
|
+
import threading
|
|
81
82
|
import time
|
|
82
83
|
from contextlib import closing
|
|
83
84
|
from pathlib import Path
|
|
@@ -186,6 +187,9 @@ class CoordStore(Protocol):
|
|
|
186
187
|
def get_assignment(self, assignment_id: str) -> dict | None: ...
|
|
187
188
|
def get_issue(self, repo_name: str, number: int) -> dict | None: ...
|
|
188
189
|
|
|
190
|
+
# ── change detection (#3294) ────────────────────────────────────────────
|
|
191
|
+
def change_token(self) -> str: ...
|
|
192
|
+
|
|
189
193
|
|
|
190
194
|
def compute_board_keep_ids(
|
|
191
195
|
assignment_index: list[dict],
|
|
@@ -305,10 +309,28 @@ class SqliteStore:
|
|
|
305
309
|
pooling under real load) and never migrates the DB. ``board_projection``
|
|
306
310
|
opens a single connection so the whole payload is one consistent
|
|
307
311
|
snapshot.
|
|
312
|
+
|
|
313
|
+
``change_token()`` (#3294) is the one exception to "fresh connection per
|
|
314
|
+
call": ``PRAGMA data_version`` is relative to the connection that reads
|
|
315
|
+
it — a brand-new SQLite connection always reports the same baseline
|
|
316
|
+
value no matter how many *other* connections have committed writes
|
|
317
|
+
before it opened, and only starts advancing once IT has observed a
|
|
318
|
+
change. So the cheap "did anything write?" signal only works against a
|
|
319
|
+
connection this store keeps open across calls; see ``_change_conn``
|
|
320
|
+
below and ``change_token``'s docstring.
|
|
308
321
|
"""
|
|
309
322
|
|
|
310
323
|
def __init__(self, db_path: Path | str | None = None) -> None:
|
|
311
324
|
self._path = Path(db_path) if db_path is not None else DB_PATH
|
|
325
|
+
# #3294: lazily-opened, kept-open connection dedicated to
|
|
326
|
+
# `change_token()` — see the class docstring for why this one
|
|
327
|
+
# connection is the exception to "fresh connection per call".
|
|
328
|
+
# Guarded by `_change_lock` because it is shared between the event
|
|
329
|
+
# loop thread (the /board handler's initial freshness check) and a
|
|
330
|
+
# threadpool worker (the same handler's rebuild leader) — see
|
|
331
|
+
# coord.serve_app's board().
|
|
332
|
+
self._change_conn: Any = None
|
|
333
|
+
self._change_lock = threading.Lock()
|
|
312
334
|
|
|
313
335
|
# ── connection ────────────────────────────────────────────────────────────
|
|
314
336
|
def _connect(self) -> Any:
|
|
@@ -576,3 +598,77 @@ class SqliteStore:
|
|
|
576
598
|
# retention cap; `after_json` arrives decoded as a real list.
|
|
577
599
|
"drive_queue": self._table(conn, "drive_queue", order="position"),
|
|
578
600
|
}
|
|
601
|
+
|
|
602
|
+
# ── change detection (#3294) ────────────────────────────────────────────
|
|
603
|
+
def _open_change_conn(self) -> Any:
|
|
604
|
+
conn = sql.connect(
|
|
605
|
+
backend=sql.DIALECT_SQLITE,
|
|
606
|
+
sqlite_path=self._path,
|
|
607
|
+
read_only=True,
|
|
608
|
+
check_same_thread=False,
|
|
609
|
+
)
|
|
610
|
+
sql.apply_row_factory(conn)
|
|
611
|
+
sql.apply_connection_setup(conn, read_only=True)
|
|
612
|
+
return conn
|
|
613
|
+
|
|
614
|
+
def change_token(self) -> str:
|
|
615
|
+
"""A cheap, opaque "has anything been written since I last asked?" token.
|
|
616
|
+
|
|
617
|
+
Backs the ``/board`` read path's cache invalidation in
|
|
618
|
+
``coord.serve_app`` (the board() handler's cache block): a 1.5 s TTL
|
|
619
|
+
forced a full board rebuild on essentially every poll even when
|
|
620
|
+
nothing had changed, because pollers run at 5 s and always missed the
|
|
621
|
+
window. This token replaces "younger than N seconds" with "no write
|
|
622
|
+
since this build" as the PRIMARY trigger -- the TTL survives only as
|
|
623
|
+
a safety upper bound (see serve_app.py) in case this token's source
|
|
624
|
+
ever misses a write path.
|
|
625
|
+
|
|
626
|
+
SQLite: :func:`coord.sql.sqlite_data_version` (``PRAGMA
|
|
627
|
+
data_version``, spelled in the dialect seam rather than here --
|
|
628
|
+
``PRAGMA`` is SQLite-only statement text and ``coord/sql.py`` is the
|
|
629
|
+
one module allowed to name one, #2782/#1948), which changes whenever
|
|
630
|
+
ANY connection -- not just this process's own POSTs, but the
|
|
631
|
+
drive-queue timer and a concurrent ``coord notify`` writing locally
|
|
632
|
+
too -- commits to the database file. **Unlike every other read in
|
|
633
|
+
this class, this is NOT a fresh connection per call**: ``data_version``
|
|
634
|
+
is relative to the connection that reads it, and a brand-new
|
|
635
|
+
connection always reports the same baseline value regardless of how
|
|
636
|
+
many other connections committed before it opened -- it only starts
|
|
637
|
+
advancing once it has personally observed a change. So this method
|
|
638
|
+
reuses one connection (``_change_conn``, opened lazily, guarded by
|
|
639
|
+
``_change_lock`` since it's shared between the event loop thread and
|
|
640
|
+
a threadpool worker -- see ``coord.serve_app.board()``) across every
|
|
641
|
+
call for the life of this ``SqliteStore``. See
|
|
642
|
+
https://sqlite.org/pragma.html#pragma_data_version. A failure (e.g.
|
|
643
|
+
the connection went stale) reopens once and, failing that, propagates
|
|
644
|
+
-- callers must treat any exception here as "assume changed, rebuild"
|
|
645
|
+
rather than crash the read path over a cache optimization.
|
|
646
|
+
|
|
647
|
+
Postgres (#827's in-flight lane): TODO(#3294-pg) -- ``data_version``
|
|
648
|
+
has no Postgres equivalent. A ``board_revision`` sequence bumped at
|
|
649
|
+
each write choke point (the ``_*_local()`` family in
|
|
650
|
+
``coord/state.py``) or a ``LISTEN``/``NOTIFY`` channel are the two
|
|
651
|
+
candidates the issue names; until one lands, this returns a constant
|
|
652
|
+
so two calls always compare equal and the cache degrades to
|
|
653
|
+
"TTL-only" -- exactly today's (pre-#3294) behaviour -- rather than
|
|
654
|
+
silently caching forever or rebuilding on every request.
|
|
655
|
+
"""
|
|
656
|
+
target = db_mod._resolve_store_target()
|
|
657
|
+
if target.backend == sql.DIALECT_POSTGRES:
|
|
658
|
+
return "pg-change-token-unimplemented" # TODO(#3294-pg)
|
|
659
|
+
with self._change_lock:
|
|
660
|
+
if self._change_conn is None:
|
|
661
|
+
self._change_conn = self._open_change_conn()
|
|
662
|
+
try:
|
|
663
|
+
return sql.sqlite_data_version(self._change_conn)
|
|
664
|
+
except Exception: # noqa: BLE001 — reopen-once fallback, see below
|
|
665
|
+
# Stale/broken connection (e.g. the underlying file was
|
|
666
|
+
# replaced out from under us) — reopen once. A repeat
|
|
667
|
+
# failure propagates to the caller, which treats it as
|
|
668
|
+
# "assume changed" rather than serving a false cache hit.
|
|
669
|
+
try:
|
|
670
|
+
self._change_conn.close()
|
|
671
|
+
except Exception: # noqa: BLE001 — already broken, best effort
|
|
672
|
+
pass
|
|
673
|
+
self._change_conn = self._open_change_conn()
|
|
674
|
+
return sql.sqlite_data_version(self._change_conn)
|
|
@@ -7,6 +7,16 @@ Like the other fleet checks in this package, the daemon's ``/board`` handler
|
|
|
7
7
|
(``coord.serve_app``) is the thing that actually measures its own latency and
|
|
8
8
|
serialized body size on each rebuild; this probe only judges the numbers it's
|
|
9
9
|
handed.
|
|
10
|
+
|
|
11
|
+
#3294 added a third, advisory-only number: how many rebuilds actually
|
|
12
|
+
*published* in the last 60s (``board_builds_per_minute`` on ``daemon_host``,
|
|
13
|
+
tracked by ``FleetHealthRefresher.record_board_stats``). The ``/board`` cache
|
|
14
|
+
used to rebuild on a fixed 1.5s TTL regardless of whether anything had
|
|
15
|
+
written — pollers run at 5s, so that meant a rebuild on nearly every poll.
|
|
16
|
+
The cache's primary trigger is now "a write happened" (``dao.CoordStore.
|
|
17
|
+
change_token``); this field is what makes that claim measurable rather than
|
|
18
|
+
assumed. Never affects severity — a burst of real writes legitimately drives
|
|
19
|
+
it up.
|
|
10
20
|
"""
|
|
11
21
|
|
|
12
22
|
from __future__ import annotations
|
|
@@ -41,6 +51,13 @@ def probe_board_latency(ctx: HealthContext) -> CheckResult:
|
|
|
41
51
|
dh = ctx.fleet.daemon_host or {}
|
|
42
52
|
latency_ms = dh.get("board_latency_ms")
|
|
43
53
|
payload_bytes = dh.get("board_payload_bytes")
|
|
54
|
+
# #3294: how many /board REBUILDS (not requests) published in the last
|
|
55
|
+
# 60s — the direct measurement of whether the write-triggered cache
|
|
56
|
+
# (dao.CoordStore.change_token, replacing the old 1.5s TTL) is actually
|
|
57
|
+
# cutting rebuilds, rather than an assumption. Advisory only: absent on
|
|
58
|
+
# an older daemon that hasn't published a build yet, and never affects
|
|
59
|
+
# severity below — a burst of real writes legitimately drives this up.
|
|
60
|
+
builds_per_minute = dh.get("board_builds_per_minute")
|
|
44
61
|
|
|
45
62
|
if latency_ms is None and payload_bytes is None:
|
|
46
63
|
return CheckResult(
|
|
@@ -72,6 +89,8 @@ def probe_board_latency(ctx: HealthContext) -> CheckResult:
|
|
|
72
89
|
parts.append(f"{latency_ms:.0f}ms")
|
|
73
90
|
if payload_bytes is not None:
|
|
74
91
|
parts.append(human_bytes(payload_bytes))
|
|
92
|
+
if builds_per_minute is not None:
|
|
93
|
+
parts.append(f"{builds_per_minute} build/min")
|
|
75
94
|
headroom = " / ".join(parts) if parts else "no data"
|
|
76
95
|
if severity is not Severity.OK:
|
|
77
96
|
headroom += f" ({', '.join(reasons)})"
|
|
@@ -85,5 +104,9 @@ def probe_board_latency(ctx: HealthContext) -> CheckResult:
|
|
|
85
104
|
f"warn at {human_bytes(_PAYLOAD_WARN_BYTES)}/{_LATENCY_WARN_MS:.0f}ms, "
|
|
86
105
|
f"crit at {human_bytes(_PAYLOAD_CRIT_BYTES)}/{_LATENCY_CRIT_MS:.0f}ms"
|
|
87
106
|
),
|
|
88
|
-
values={
|
|
107
|
+
values={
|
|
108
|
+
"latency_ms": latency_ms,
|
|
109
|
+
"payload_bytes": payload_bytes,
|
|
110
|
+
"builds_per_minute": builds_per_minute,
|
|
111
|
+
},
|
|
89
112
|
)
|
|
@@ -39,6 +39,7 @@ import json
|
|
|
39
39
|
import logging
|
|
40
40
|
import os
|
|
41
41
|
import time
|
|
42
|
+
from collections import deque
|
|
42
43
|
from dataclasses import dataclass, field
|
|
43
44
|
from pathlib import Path
|
|
44
45
|
|
|
@@ -276,6 +277,13 @@ class FleetHealthRefresher:
|
|
|
276
277
|
# than fabricating a 0.
|
|
277
278
|
self._board_latency_ms: float | None = None
|
|
278
279
|
self._board_payload_bytes: int | None = None
|
|
280
|
+
# #3294: one timestamp per PUBLISHED /board build (never per request
|
|
281
|
+
# — a cache hit or a 304 doesn't rebuild, so it doesn't append here).
|
|
282
|
+
# This is the daemon-side, directly-measured answer to "did #3294's
|
|
283
|
+
# write-triggered cache actually cut rebuilds?", rather than an
|
|
284
|
+
# assumption — see `_builds_per_minute` and `probe_board_latency`
|
|
285
|
+
# (coord/health/checks/fleet_board.py).
|
|
286
|
+
self._board_build_timestamps: deque[float] = deque()
|
|
279
287
|
|
|
280
288
|
def snapshot(self) -> FleetHealthSnapshot:
|
|
281
289
|
return self._snapshot
|
|
@@ -284,12 +292,31 @@ class FleetHealthRefresher:
|
|
|
284
292
|
"""Called by the /board handler after each publish (#1630/#1597).
|
|
285
293
|
|
|
286
294
|
Deliberately NOT I/O and NOT gated on the tick cadence — recording a
|
|
287
|
-
float+int is free, and the alternative
|
|
288
|
-
independently from this refresher) would
|
|
289
|
-
second board just to measure it, defeating the
|
|
295
|
+
float+int (+ one timestamp, #3294) is free, and the alternative
|
|
296
|
+
(recomputing board latency independently from this refresher) would
|
|
297
|
+
mean building a whole second board just to measure it, defeating the
|
|
298
|
+
point of the check.
|
|
290
299
|
"""
|
|
291
300
|
self._board_latency_ms = latency_ms
|
|
292
301
|
self._board_payload_bytes = payload_bytes
|
|
302
|
+
self._board_build_timestamps.append(time.time())
|
|
303
|
+
self._prune_build_timestamps()
|
|
304
|
+
|
|
305
|
+
def _prune_build_timestamps(self, now: float | None = None) -> None:
|
|
306
|
+
"""Drop build timestamps older than 60s — #3294's rolling window."""
|
|
307
|
+
cutoff = (now if now is not None else time.time()) - 60.0
|
|
308
|
+
timestamps = self._board_build_timestamps
|
|
309
|
+
while timestamps and timestamps[0] < cutoff:
|
|
310
|
+
timestamps.popleft()
|
|
311
|
+
|
|
312
|
+
def _builds_per_minute(self, now: float) -> int:
|
|
313
|
+
"""#3294: how many /board REBUILDS (not requests) published in the
|
|
314
|
+
last 60s — the direct measurement backing the write-triggered
|
|
315
|
+
cache's whole premise ("rebuilds should track writes, not a 5s poll
|
|
316
|
+
clock"). Read by `refresh()` below into ``daemon_host`` for
|
|
317
|
+
``fleet_board_latency`` (coord/health/checks/fleet_board.py)."""
|
|
318
|
+
self._prune_build_timestamps(now)
|
|
319
|
+
return len(self._board_build_timestamps)
|
|
293
320
|
|
|
294
321
|
def refresh(self, config) -> FleetHealthSnapshot: # noqa: ANN001 — coord.config.Config
|
|
295
322
|
from coord import network, state # noqa: PLC0415
|
|
@@ -376,6 +403,7 @@ class FleetHealthRefresher:
|
|
|
376
403
|
daemon_host["phantom_running"] = self._phantom_running_rows(machines)
|
|
377
404
|
daemon_host["board_latency_ms"] = self._board_latency_ms
|
|
378
405
|
daemon_host["board_payload_bytes"] = self._board_payload_bytes
|
|
406
|
+
daemon_host["board_builds_per_minute"] = self._builds_per_minute(now)
|
|
379
407
|
# #2858: per-repo issues-sync staleness — a small local JSON read
|
|
380
408
|
# (coord.issues_sync_status), same "daemon-host-local fact" shape as
|
|
381
409
|
# the two lines above. `coord.health.checks.issues_sync_staleness`
|
|
@@ -5821,14 +5821,30 @@ def build_app(
|
|
|
5821
5821
|
|
|
5822
5822
|
_machine_metrics_sampler = machine_metrics_sampler or MachineMetricsSampler()
|
|
5823
5823
|
|
|
5824
|
-
#
|
|
5825
|
-
#
|
|
5824
|
+
# Cache for the computed /board projection so burst polls from the TUI
|
|
5825
|
+
# don't each pay the full board_projection + merge-plan + stage-projection
|
|
5826
5826
|
# recomputation (~465-issue load measured in the issue). Keyed to nothing
|
|
5827
|
-
# (one board per daemon instance).
|
|
5828
|
-
#
|
|
5829
|
-
#
|
|
5827
|
+
# (one board per daemon instance).
|
|
5828
|
+
#
|
|
5829
|
+
# #3294: the cache's PRIMARY invalidation trigger is "has anything
|
|
5830
|
+
# written since this build?" (``store.change_token()``, ``dao.CoordStore``
|
|
5831
|
+
# protocol — SQLite: ``PRAGMA data_version``), not a fixed clock. A 1.5 s
|
|
5832
|
+
# TTL forced a full rebuild on essentially every poll, because pollers
|
|
5833
|
+
# run at 5 s and always missed the window — and the rebuild (the
|
|
5834
|
+
# ``fleet_board_latency`` check's own 0.65-0.8 s measurement) is what
|
|
5835
|
+
# actually held the GIL, not the wire cost the ETag already covers.
|
|
5836
|
+
# ``COORD_BOARD_CACHE_TTL`` (default below) survives only as a SAFETY
|
|
5837
|
+
# UPPER BOUND — a rebuild is forced past that age regardless of the
|
|
5838
|
+
# change token, in case the token's source ever misses a write path —
|
|
5839
|
+
# not as the primary trigger. Busted immediately on board-mutating POSTs
|
|
5840
|
+
# (``_bust_board_cache``, unchanged by #3294) so a user action is visible
|
|
5841
|
+
# on the very next poll without waiting on either signal.
|
|
5830
5842
|
_board_cache: dict | None = None
|
|
5831
5843
|
_board_cache_at: float = 0.0
|
|
5844
|
+
# #3294: the ``store.change_token()`` value as of ``_board_cache``'s
|
|
5845
|
+
# build. A poll is served from cache only when the CURRENT token still
|
|
5846
|
+
# equals this one — i.e. nothing has written since.
|
|
5847
|
+
_board_cache_token: str | None = None
|
|
5832
5848
|
# #1597 Part 2: the fully-rendered JSON bytes for the currently-cached
|
|
5833
5849
|
# build, shared verbatim by every response that serves ``_board_cache``
|
|
5834
5850
|
# (a fresh build's own responses, every single-flight follower, and
|
|
@@ -6040,18 +6056,35 @@ def build_app(
|
|
|
6040
6056
|
# config reloads prompt.
|
|
6041
6057
|
_refresh_config()
|
|
6042
6058
|
|
|
6043
|
-
# Part 2 (cache): serve
|
|
6044
|
-
#
|
|
6045
|
-
#
|
|
6046
|
-
#
|
|
6047
|
-
#
|
|
6059
|
+
# Part 2 (cache): serve the cached projection when nothing has
|
|
6060
|
+
# written since it was built (#3294). Burst polls (TUI polls every
|
|
6061
|
+
# ~2 s) hit the cache; the real computation only runs when a write
|
|
6062
|
+
# actually happened. Cache is also busted immediately by the
|
|
6063
|
+
# board-mutating POST handlers below so user actions are visible on
|
|
6064
|
+
# the very next poll without waiting on either signal.
|
|
6048
6065
|
import time as _time # noqa: PLC0415
|
|
6049
|
-
|
|
6066
|
+
# Safety upper bound only (#3294) — see the comment on
|
|
6067
|
+
# `_board_cache_token` above. Raised from the pre-#3294 1.5 s default
|
|
6068
|
+
# now that the change-token check is the primary trigger.
|
|
6069
|
+
_safety_ttl = float(os.getenv("COORD_BOARD_CACHE_TTL", "30"))
|
|
6050
6070
|
_now = _time.monotonic()
|
|
6051
6071
|
nonlocal _board_cache, _board_cache_at, _board_cache_built_at, _board_body
|
|
6052
|
-
nonlocal _board_inflight
|
|
6072
|
+
nonlocal _board_cache_token, _board_inflight
|
|
6053
6073
|
_client_etag = request.headers.get("if-none-match")
|
|
6054
6074
|
|
|
6075
|
+
# #3294: cheap "did anything write?" probe — see
|
|
6076
|
+
# `dao.CoordStore.change_token`'s docstring. Run inline (not
|
|
6077
|
+
# threadpooled) like `_refresh_config()`'s stat() just above: a
|
|
6078
|
+
# single PRAGMA on an already-open connection, not I/O of the shape
|
|
6079
|
+
# #1336 invariant 1 guards against. A failure here must never crash
|
|
6080
|
+
# the read path over a cache optimization — treat it as "assume
|
|
6081
|
+
# changed" (a sentinel that can never equal a real cached token) so
|
|
6082
|
+
# the worst case is an extra rebuild, never a wedged/stale cache.
|
|
6083
|
+
try:
|
|
6084
|
+
_current_token: str | None = store.change_token()
|
|
6085
|
+
except Exception: # noqa: BLE001 — fail toward rebuilding, not crashing
|
|
6086
|
+
_current_token = None
|
|
6087
|
+
|
|
6055
6088
|
def _respond(result: dict, etag: str | None, body: bytes | None) -> Response:
|
|
6056
6089
|
if _client_etag and etag and _client_etag == etag:
|
|
6057
6090
|
# STILL identical to what the client holds — spare the wire
|
|
@@ -6076,7 +6109,18 @@ def build_app(
|
|
|
6076
6109
|
_cached_etag = _board_etag
|
|
6077
6110
|
_cached_at = _board_cache_at
|
|
6078
6111
|
_cached_body = _board_body
|
|
6079
|
-
|
|
6112
|
+
_cached_token = _board_cache_token
|
|
6113
|
+
# #3294: fresh iff nothing wrote since this build (token still
|
|
6114
|
+
# matches) AND we're inside the safety-TTL ceiling. `_cached_token
|
|
6115
|
+
# is not None` rules out a `None == None` false match when either
|
|
6116
|
+
# side came from a failed change_token() read (see above).
|
|
6117
|
+
_fresh = (
|
|
6118
|
+
_cached is not None
|
|
6119
|
+
and _cached_token is not None
|
|
6120
|
+
and _cached_token == _current_token
|
|
6121
|
+
and (_now - _cached_at) < _safety_ttl
|
|
6122
|
+
)
|
|
6123
|
+
if _fresh:
|
|
6080
6124
|
return _respond(_cached, _cached_etag, _cached_body)
|
|
6081
6125
|
|
|
6082
6126
|
# #1597 Part 1: single-flight the rebuild. On a cache miss, at most
|
|
@@ -6122,12 +6166,24 @@ def build_app(
|
|
|
6122
6166
|
# concurrent request calls _refresh_config() while _build() is running.
|
|
6123
6167
|
_cfg = config
|
|
6124
6168
|
|
|
6125
|
-
def _build() -> tuple[float, dict]:
|
|
6169
|
+
def _build() -> tuple[float, str | None, dict]:
|
|
6126
6170
|
# Snapshot-order stamp: captured immediately before the DB read so
|
|
6127
6171
|
# the publish step below can reject a build whose snapshot is
|
|
6128
6172
|
# older than the one already cached (concurrent rebuilds can
|
|
6129
6173
|
# finish out of order).
|
|
6130
6174
|
_built_at = _time.monotonic()
|
|
6175
|
+
# #3294: the change token AS OF this build's snapshot moment —
|
|
6176
|
+
# published alongside the cache below so the *next* request's
|
|
6177
|
+
# freshness check compares against "what had (or hadn't) written
|
|
6178
|
+
# by the time THIS build started", not some later moment.
|
|
6179
|
+
# `None` (never a real token — see `_current_token` above) if the
|
|
6180
|
+
# read itself fails; that means the published cache below can
|
|
6181
|
+
# never look "fresh" to a later poll, which is the safe direction
|
|
6182
|
+
# to fail in.
|
|
6183
|
+
try:
|
|
6184
|
+
_built_token = store.change_token()
|
|
6185
|
+
except Exception: # noqa: BLE001 — see `_current_token` above
|
|
6186
|
+
_built_token = None
|
|
6131
6187
|
# ── board projection ──────────────────────────────────────────────
|
|
6132
6188
|
try:
|
|
6133
6189
|
projection = store.board_projection()
|
|
@@ -6593,7 +6649,7 @@ def build_app(
|
|
|
6593
6649
|
from coord.board_wire import bound_board_payload as _bound # noqa: PLC0415
|
|
6594
6650
|
|
|
6595
6651
|
_bound(projection)
|
|
6596
|
-
return _built_at, projection
|
|
6652
|
+
return _built_at, _built_token, projection
|
|
6597
6653
|
|
|
6598
6654
|
# This coroutine is the single-flight leader: it alone runs _build(),
|
|
6599
6655
|
# then fans its outcome out to every waiter (itself plus every
|
|
@@ -6601,7 +6657,7 @@ def build_app(
|
|
|
6601
6657
|
# of the acceptance test, and why a failed build must reach every
|
|
6602
6658
|
# waiter rather than wedging the followers.
|
|
6603
6659
|
try:
|
|
6604
|
-
built_at, result = await run_in_threadpool(_build)
|
|
6660
|
+
built_at, built_token, result = await run_in_threadpool(_build)
|
|
6605
6661
|
except _BoardReadError as e:
|
|
6606
6662
|
_board_inflight = None # clear FIRST: a retry must build fresh,
|
|
6607
6663
|
# never see a "done" future and think it must wait on this one.
|
|
@@ -6650,7 +6706,9 @@ def build_app(
|
|
|
6650
6706
|
_board_body = body
|
|
6651
6707
|
_board_cache_at = _time.monotonic()
|
|
6652
6708
|
_board_cache_built_at = built_at
|
|
6653
|
-
# #
|
|
6709
|
+
_board_cache_token = built_token # #3294
|
|
6710
|
+
# #1630/#3294: feed this build's own latency + wire size
|
|
6711
|
+
# (+ the fact that a build happened at all) to the
|
|
6654
6712
|
# fleet-health snapshot's board-latency check — read back
|
|
6655
6713
|
# on the health-poll tick's own cadence, never recomputed
|
|
6656
6714
|
# inline (see FleetHealthRefresher.record_board_stats).
|
|
@@ -1195,6 +1195,42 @@ def sqlite_integrity_check(conn: Any) -> str:
|
|
|
1195
1195
|
return str(rows[0][0]) if rows else "<no output>"
|
|
1196
1196
|
|
|
1197
1197
|
|
|
1198
|
+
def sqlite_data_version(conn: Any) -> str:
|
|
1199
|
+
"""SQLite's ``PRAGMA data_version`` for *conn*, as an opaque string.
|
|
1200
|
+
|
|
1201
|
+
The value changes whenever **another** connection commits to the same
|
|
1202
|
+
database file, which makes it a cheap "has anything been written since I
|
|
1203
|
+
last looked?" signal — see :meth:`coord.dao.SqliteStore.change_token`,
|
|
1204
|
+
its only caller, which backs the ``/board`` read path's write-driven
|
|
1205
|
+
cache invalidation (#3294).
|
|
1206
|
+
|
|
1207
|
+
Two properties the caller depends on, both SQLite's, not this helper's:
|
|
1208
|
+
the value is **relative to the connection that reads it** (a freshly
|
|
1209
|
+
opened connection always reports the same baseline no matter how many
|
|
1210
|
+
commits preceded it, and only starts advancing once *it* has observed a
|
|
1211
|
+
change), so the caller must reuse one long-lived connection; and it does
|
|
1212
|
+
**not** move for this connection's own writes. See
|
|
1213
|
+
https://sqlite.org/pragma.html#pragma_data_version.
|
|
1214
|
+
|
|
1215
|
+
Lives here for the same reason :func:`sqlite_journal_mode`,
|
|
1216
|
+
:func:`sqlite_wal_checkpoint_truncate` and :func:`sqlite_integrity_check`
|
|
1217
|
+
do: ``PRAGMA`` is SQLite-only statement text with no Postgres equivalent
|
|
1218
|
+
to translate to, and this module is the one place in the tree allowed to
|
|
1219
|
+
spell one (enforced by ``tests/test_sql_dialect.py::
|
|
1220
|
+
test_no_sqlite_only_construct_in_statement_text_outside_db_and_seam``).
|
|
1221
|
+
SQLite-only: callers must already know *conn* is a SQLite connection —
|
|
1222
|
+
this helper does not dialect-guard, matching the rest of that family.
|
|
1223
|
+
|
|
1224
|
+
An empty result (which real SQLite never produces, but a stubbed
|
|
1225
|
+
connection in a test can) degrades to ``"0"``. That is a *constant*, so a
|
|
1226
|
+
caller comparing two such tokens sees "unchanged" — callers that cannot
|
|
1227
|
+
tolerate a false "unchanged" must treat an exception here as "assume
|
|
1228
|
+
changed", which is what ``change_token``'s caller does.
|
|
1229
|
+
"""
|
|
1230
|
+
row = execute(conn, "PRAGMA data_version").fetchone()
|
|
1231
|
+
return str(row[0]) if row is not None else "0"
|
|
1232
|
+
|
|
1233
|
+
|
|
1198
1234
|
def driver_error(conn: Any) -> type[BaseException]:
|
|
1199
1235
|
"""The DB-API ``Error`` base class *conn*'s driver raises (#2766).
|
|
1200
1236
|
|
|
@@ -186,6 +186,70 @@ def test_board_version_bumps_when_content_changes(
|
|
|
186
186
|
assert r3.headers["etag"] != r1.headers["etag"]
|
|
187
187
|
|
|
188
188
|
|
|
189
|
+
# ── #3294: the cache rebuilds on a write, not on a clock ─────────────────────
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def test_board_rebuild_trigger_is_a_write_not_the_ttl_clock(
|
|
193
|
+
detail_db: Path, valid_config_path: Path, monkeypatch
|
|
194
|
+
) -> None:
|
|
195
|
+
"""#3294 acceptance: two ``/board`` requests with NO intervening write
|
|
196
|
+
must produce exactly one ``board_projection()`` build, and a write
|
|
197
|
+
between them must force a second — asserted on a build counter, never on
|
|
198
|
+
timing (the issue's own words: "Timing-based assertions will be flaky —
|
|
199
|
+
count builds").
|
|
200
|
+
|
|
201
|
+
The write here is a RAW external SQLite commit — not a POST to
|
|
202
|
+
``/board``, which already busted the cache explicitly and always did.
|
|
203
|
+
This is the case #3294 actually exists for: the drive-queue timer and a
|
|
204
|
+
concurrent ``coord notify`` write the DB directly, with no daemon POST
|
|
205
|
+
anywhere in the picture. Before #3294 a write from either of those
|
|
206
|
+
sources was invisible to the ``/board`` cache until its TTL (1.5 s by
|
|
207
|
+
default, pre-fix) happened to expire on its own. This test pins the
|
|
208
|
+
safety-TTL to a deliberately generous 60 s specifically so the *only*
|
|
209
|
+
thing that can explain the second build is the change-token check
|
|
210
|
+
noticing the external write — a TTL-only cache would still be showing
|
|
211
|
+
the stale, pre-write board at that point.
|
|
212
|
+
"""
|
|
213
|
+
call_count = 0
|
|
214
|
+
original_projection = SqliteStore.board_projection
|
|
215
|
+
|
|
216
|
+
def counting_projection(self): # noqa: ANN001
|
|
217
|
+
nonlocal call_count
|
|
218
|
+
call_count += 1
|
|
219
|
+
return original_projection(self)
|
|
220
|
+
|
|
221
|
+
monkeypatch.setattr(SqliteStore, "board_projection", counting_projection)
|
|
222
|
+
monkeypatch.setenv("COORD_BOARD_CACHE_TTL", "60") # generous safety ceiling
|
|
223
|
+
|
|
224
|
+
cfg = load_config(valid_config_path)
|
|
225
|
+
app = build_app(SqliteStore(detail_db), cfg)
|
|
226
|
+
with TestClient(app) as cli:
|
|
227
|
+
r1 = cli.get("/board")
|
|
228
|
+
assert r1.status_code == 200
|
|
229
|
+
assert call_count == 1
|
|
230
|
+
|
|
231
|
+
r2 = cli.get("/board")
|
|
232
|
+
assert r2.status_code == 200
|
|
233
|
+
assert call_count == 1, "no write happened — must still be exactly one build"
|
|
234
|
+
|
|
235
|
+
# A write from OUTSIDE the daemon entirely: no POST /board, no
|
|
236
|
+
# `_bust_board_cache()` call — the drive-queue-timer / `coord notify`
|
|
237
|
+
# shape the issue names.
|
|
238
|
+
conn = sqlite3.connect(str(detail_db))
|
|
239
|
+
conn.execute(
|
|
240
|
+
"UPDATE assignments SET status='failed' WHERE assignment_id='work1'"
|
|
241
|
+
)
|
|
242
|
+
conn.commit()
|
|
243
|
+
conn.close()
|
|
244
|
+
|
|
245
|
+
r3 = cli.get("/board")
|
|
246
|
+
assert r3.status_code == 200
|
|
247
|
+
assert call_count == 2, (
|
|
248
|
+
"an external write must trigger a rebuild via the change token, "
|
|
249
|
+
"well before the 60s safety TTL elapses"
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
|
|
189
253
|
def test_board_digest_projection_masks_only_the_named_volatile_fields() -> None:
|
|
190
254
|
"""#3293 unit-level check on ``_board_digest_projection`` itself: the
|
|
191
255
|
three named culprits (``audit_recent_count``, ``issues[*].synced_at``,
|
|
@@ -420,12 +484,22 @@ def test_stale_concurrent_rebuild_is_never_published(
|
|
|
420
484
|
|
|
421
485
|
monkeypatch.setenv("COORD_BOARD_CACHE_TTL", "1000") # cache once published
|
|
422
486
|
|
|
487
|
+
# #3294: `_build()` is faked below (it never touches the real store), so
|
|
488
|
+
# pin `store.change_token()` to a fixed value too — otherwise the
|
|
489
|
+
# handler's real (unmocked) freshness check would compare the fake
|
|
490
|
+
# build's canned token against the REAL store's live `PRAGMA
|
|
491
|
+
# data_version` and never see a match, breaking the cache-hit path this
|
|
492
|
+
# test relies on for its final 304. Irrelevant to what this test
|
|
493
|
+
# actually exercises (out-of-order publish, not change detection).
|
|
494
|
+
store = SqliteStore(detail_db)
|
|
495
|
+
monkeypatch.setattr(store, "change_token", lambda: "fixed-token")
|
|
496
|
+
|
|
423
497
|
# Deterministic out-of-order completion: the first request's build
|
|
424
498
|
# carries a NEWER snapshot stamp than the second's (as if the second
|
|
425
499
|
# started earlier but finished later).
|
|
426
500
|
results = iter([
|
|
427
|
-
(100.0, {"round_number": 1, "marker": "NEW"}),
|
|
428
|
-
(50.0, {"round_number": 1, "marker": "STALE"}),
|
|
501
|
+
(100.0, "fixed-token", {"round_number": 1, "marker": "NEW"}),
|
|
502
|
+
(50.0, "fixed-token", {"round_number": 1, "marker": "STALE"}),
|
|
429
503
|
])
|
|
430
504
|
|
|
431
505
|
async def _fake_run_in_threadpool(fn, *args): # noqa: ANN001, ARG001
|
|
@@ -434,7 +508,7 @@ def test_stale_concurrent_rebuild_is_never_published(
|
|
|
434
508
|
monkeypatch.setattr(sc, "run_in_threadpool", _fake_run_in_threadpool)
|
|
435
509
|
|
|
436
510
|
cfg = load_config(valid_config_path)
|
|
437
|
-
app = build_app(
|
|
511
|
+
app = build_app(store, cfg)
|
|
438
512
|
with TestClient(app) as cli:
|
|
439
513
|
r1 = cli.get("/board")
|
|
440
514
|
assert r1.json()["marker"] == "NEW"
|
|
@@ -542,6 +542,64 @@ def test_sqlite_integrity_check_degrades_to_a_placeholder_on_an_empty_result(mon
|
|
|
542
542
|
assert sql.sqlite_integrity_check(object()) == "<no output>"
|
|
543
543
|
|
|
544
544
|
|
|
545
|
+
# ── change detection: sqlite_data_version (#3294) ────────────────────────
|
|
546
|
+
#
|
|
547
|
+
# The /board read path's write-driven cache invalidation calls this instead
|
|
548
|
+
# of spelling `PRAGMA data_version` in coord/dao.py, where the SQLite-only
|
|
549
|
+
# statement-text ratchet below would (correctly) reject it.
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
def test_sqlite_data_version_advances_when_another_connection_commits(tmp_path):
|
|
553
|
+
"""The property #3294's cache depends on: the token MOVES on somebody
|
|
554
|
+
else's commit, and holds still when nobody writes.
|
|
555
|
+
|
|
556
|
+
Both halves matter and neither implies the other — a helper that returned
|
|
557
|
+
a fresh constant every call would pass "it changed" while making the
|
|
558
|
+
cache useless, and one that returned a hardcoded constant would pass "it
|
|
559
|
+
held still" while making the cache serve stale boards forever. Driven
|
|
560
|
+
through two real connections on a file DB because that *is* the semantics
|
|
561
|
+
under test: `PRAGMA data_version` only reports commits made by a
|
|
562
|
+
connection other than the reader's own.
|
|
563
|
+
"""
|
|
564
|
+
db = tmp_path / "dv.db"
|
|
565
|
+
writer = sqlite3.connect(str(db))
|
|
566
|
+
reader = sqlite3.connect(str(db))
|
|
567
|
+
try:
|
|
568
|
+
writer.execute("CREATE TABLE t (id INTEGER PRIMARY KEY)")
|
|
569
|
+
writer.commit()
|
|
570
|
+
|
|
571
|
+
before = sql.sqlite_data_version(reader)
|
|
572
|
+
assert sql.sqlite_data_version(reader) == before, (
|
|
573
|
+
"no write happened between these two reads — the token must not move"
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
writer.execute("INSERT INTO t (id) VALUES (1)")
|
|
577
|
+
writer.commit()
|
|
578
|
+
|
|
579
|
+
assert sql.sqlite_data_version(reader) != before, (
|
|
580
|
+
"another connection committed — the token must move, or the "
|
|
581
|
+
"/board cache can never notice an external write"
|
|
582
|
+
)
|
|
583
|
+
finally:
|
|
584
|
+
reader.close()
|
|
585
|
+
writer.close()
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
def test_sqlite_data_version_degrades_to_a_constant_on_an_empty_result(monkeypatch):
|
|
589
|
+
"""Real SQLite always answers with a row, but a stub (or a connection in
|
|
590
|
+
an exotic state) might not. Degrade to a constant rather than raising:
|
|
591
|
+
``change_token``'s caller treats an exception as "assume changed", and an
|
|
592
|
+
IndexError escaping here would turn a missing PRAGMA row into a permanent
|
|
593
|
+
rebuild-on-every-request."""
|
|
594
|
+
|
|
595
|
+
class _Cursor:
|
|
596
|
+
def fetchone(self):
|
|
597
|
+
return None
|
|
598
|
+
|
|
599
|
+
monkeypatch.setattr(sql, "execute", lambda conn, statement, params=(): _Cursor())
|
|
600
|
+
assert sql.sqlite_data_version(object()) == "0"
|
|
601
|
+
|
|
602
|
+
|
|
545
603
|
# ── row factory ──────────────────────────────────────────────────────────
|
|
546
604
|
|
|
547
605
|
|