code-coordinator 0.5.451__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.451 → code_coordinator-0.5.453}/PKG-INFO +1 -1
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/scm_file_list.json +2 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/client.py +54 -3
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dao.py +96 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dashboard/server.py +98 -14
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/fleet_board.py +24 -1
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/fleet_snapshot.py +31 -3
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/serve_app.py +75 -17
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/sql.py +36 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/conftest.py +20 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_read_path.py +77 -3
- code_coordinator-0.5.453/tests/test_client.py +206 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dashboard_api.py +9 -0
- code_coordinator-0.5.453/tests/test_dashboard_server.py +224 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_sql_dialect.py +58 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_sqlite_connect_ratchet.py +19 -5
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_store_contract.py +15 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.gitignore +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/CLAUDE.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/GOAL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/LICENSE +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/MANIFEST.in +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/README.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/__init__.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agent.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/audit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/backup.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/block_log.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/board_service.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/brain.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/claim.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/cli.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/codegen.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/comments.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/config.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/db.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deps.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/drive.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/events.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/filelock.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/freshness.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/gates.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/goal.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/context.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/models.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/render.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/units.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/hooks.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/interactive.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/models.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/network.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notify.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/openapi.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/parentage.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/plans.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/progress.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/release_window.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/reports.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/review.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/self_health.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/smoke.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/split_work.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/state.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/test_author.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/test_report.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/usage.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/install-agent.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/pyproject.toml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/setup.cfg +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/__init__.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/backends.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_db.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_events.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_init.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_models.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_network.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_session.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_split.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_state.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/write_parity.py +0 -0
|
@@ -539,6 +539,7 @@ tests/test_cli_test_plan.py
|
|
|
539
539
|
tests/test_cli_track.py
|
|
540
540
|
tests/test_cli_tui_update.py
|
|
541
541
|
tests/test_cli_wait.py
|
|
542
|
+
tests/test_client.py
|
|
542
543
|
tests/test_client_base_install.py
|
|
543
544
|
tests/test_client_config_cache_atomic_3052.py
|
|
544
545
|
tests/test_client_resource_migration_1946.py
|
|
@@ -570,6 +571,7 @@ tests/test_dao.py
|
|
|
570
571
|
tests/test_dashboard.py
|
|
571
572
|
tests/test_dashboard_api.py
|
|
572
573
|
tests/test_dashboard_fixture.py
|
|
574
|
+
tests/test_dashboard_server.py
|
|
573
575
|
tests/test_dashboard_terminal.py
|
|
574
576
|
tests/test_dashboard_terminal_live.py
|
|
575
577
|
tests/test_db.py
|
{code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -565,6 +565,7 @@
|
|
|
565
565
|
"tests/test_cli_track.py",
|
|
566
566
|
"tests/test_cli_tui_update.py",
|
|
567
567
|
"tests/test_cli_wait.py",
|
|
568
|
+
"tests/test_client.py",
|
|
568
569
|
"tests/test_client_base_install.py",
|
|
569
570
|
"tests/test_client_config_cache_atomic_3052.py",
|
|
570
571
|
"tests/test_client_resource_migration_1946.py",
|
|
@@ -596,6 +597,7 @@
|
|
|
596
597
|
"tests/test_dashboard.py",
|
|
597
598
|
"tests/test_dashboard_api.py",
|
|
598
599
|
"tests/test_dashboard_fixture.py",
|
|
600
|
+
"tests/test_dashboard_server.py",
|
|
599
601
|
"tests/test_dashboard_terminal.py",
|
|
600
602
|
"tests/test_dashboard_terminal_live.py",
|
|
601
603
|
"tests/test_db.py",
|
|
@@ -88,11 +88,62 @@ def _headers(svc: ServiceConfig) -> dict[str, str]:
|
|
|
88
88
|
return headers
|
|
89
89
|
|
|
90
90
|
|
|
91
|
+
# #3295: per-service-URL ETag cache for `GET /board`, so a thin client that
|
|
92
|
+
# calls `fetch_board_payload()` repeatedly in a short window (dashboard
|
|
93
|
+
# panels each doing their own read, drive-queue polling, ...) gets a
|
|
94
|
+
# bodyless 304 back and reuses the last body instead of re-shipping and
|
|
95
|
+
# re-parsing the full board (measured at 3.5MB) on every call. The daemon
|
|
96
|
+
# has served `ETag` / honoured `If-None-Match` on `GET /board` since #1336;
|
|
97
|
+
# nothing on the server changes here, only this client now uses it.
|
|
98
|
+
# Process-local and never persisted — like `board_service._RESOURCE_ROUTE_SUPPORT`
|
|
99
|
+
# — so a fresh process (or a test) starts with an empty cache and the very
|
|
100
|
+
# next call is an unconditional GET.
|
|
101
|
+
_board_payload_cache: dict[str, tuple[str, dict]] = {}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def reset_board_payload_cache() -> None:
|
|
105
|
+
"""Forget every cached ``(etag, body)`` pair (tests; #3295)."""
|
|
106
|
+
_board_payload_cache.clear()
|
|
107
|
+
|
|
108
|
+
|
|
91
109
|
def fetch_board_payload(svc: ServiceConfig, *, timeout: float = _DEFAULT_TIMEOUT) -> dict:
|
|
92
|
-
"""GET /board → the raw projection dict (also carries machines/merge_queue/…).
|
|
93
|
-
|
|
110
|
+
"""GET /board → the raw projection dict (also carries machines/merge_queue/…).
|
|
111
|
+
|
|
112
|
+
#3295: sends ``If-None-Match`` with the ETag from this *svc.url*'s last
|
|
113
|
+
successful fetch, if any. A ``304`` means the daemon is telling us the
|
|
114
|
+
board hasn't changed since that ETag was minted — the cached body from
|
|
115
|
+
that fetch is still exactly correct, so it's returned as-is with no
|
|
116
|
+
re-parse. A ``200`` (first call for this URL, or the board really did
|
|
117
|
+
change) refreshes the cache with the new ``ETag``/body pair; a response
|
|
118
|
+
carrying no ``ETag`` at all clears any stale entry rather than caching
|
|
119
|
+
something we can't validate next time.
|
|
120
|
+
"""
|
|
121
|
+
headers = _headers(svc)
|
|
122
|
+
cached = _board_payload_cache.get(svc.url)
|
|
123
|
+
if cached is not None:
|
|
124
|
+
headers["If-None-Match"] = cached[0]
|
|
125
|
+
resp = httpx.get(f"{svc.url}/board", headers=headers, timeout=timeout)
|
|
126
|
+
if resp.status_code == 304:
|
|
127
|
+
if cached is not None:
|
|
128
|
+
return cached[1]
|
|
129
|
+
# Should never happen — we only ever send `If-None-Match` when
|
|
130
|
+
# *cached* is set, so a 304 here means the daemon answered a
|
|
131
|
+
# conditional response to an unconditional request. Surfacing this
|
|
132
|
+
# loudly beats silently returning `None`/an empty board that looks
|
|
133
|
+
# like a real (if suspiciously quiet) fleet.
|
|
134
|
+
raise RuntimeError(
|
|
135
|
+
f"GET {svc.url}/board answered 304 but this client sent no "
|
|
136
|
+
"If-None-Match (no cached ETag for this service) — refusing to "
|
|
137
|
+
"guess at a board"
|
|
138
|
+
)
|
|
94
139
|
resp.raise_for_status()
|
|
95
|
-
|
|
140
|
+
body = resp.json()
|
|
141
|
+
etag = resp.headers.get("ETag")
|
|
142
|
+
if etag:
|
|
143
|
+
_board_payload_cache[svc.url] = (etag, body)
|
|
144
|
+
else:
|
|
145
|
+
_board_payload_cache.pop(svc.url, None)
|
|
146
|
+
return body
|
|
96
147
|
|
|
97
148
|
|
|
98
149
|
def fetch_healthz(svc: ServiceConfig, *, timeout: float = _DEFAULT_TIMEOUT) -> dict:
|
|
@@ -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)
|
|
@@ -2378,22 +2378,90 @@ def build_app(
|
|
|
2378
2378
|
# would take those down to protest a missing frontend.
|
|
2379
2379
|
logger.warning("coord web: %s", webapp_bundle_missing_message(webapp_dist))
|
|
2380
2380
|
|
|
2381
|
+
# #3295: per-process board memo. Before this, EVERY `/api/*` request on
|
|
2382
|
+
# the daemon host (no `board_service` configured — the deployment
|
|
2383
|
+
# actually in use) fell through to `read_board()`: open sqlite, run the
|
|
2384
|
+
# query, walk every row through `assemble_board()`. A single screen load
|
|
2385
|
+
# (a few panels each polling their own endpoint) or one background
|
|
2386
|
+
# `_background_poller()` tick fanned that out into 2-5 independent
|
|
2387
|
+
# builds of the SAME board. In thin-client mode (`board_service`
|
|
2388
|
+
# configured) the equivalent waste was `_read_board_and_machine_health()`
|
|
2389
|
+
# and `_read_fleet_health()` each firing their OWN `fetch_board_payload()`
|
|
2390
|
+
# round trip for the same daemon snapshot.
|
|
2391
|
+
#
|
|
2392
|
+
# `_board_memo` is local to this `build_app()` closure — like
|
|
2393
|
+
# `_seen_terminal`/`_orphaned_since` below — never a module global, so
|
|
2394
|
+
# each dashboard process (and each test's own `build_app()`) gets an
|
|
2395
|
+
# independent memo that can never bleed into another's.
|
|
2396
|
+
_BOARD_MEMO_TTL_S = 2.0
|
|
2397
|
+
_board_memo: dict[str, Any] = {"at": 0.0, "board": None, "payload": None}
|
|
2398
|
+
|
|
2399
|
+
def _fetch_board_and_payload(): # -> tuple[Board, dict | None]
|
|
2400
|
+
"""Uncached ``(board, payload)`` build — what the memo below wraps.
|
|
2401
|
+
|
|
2402
|
+
``payload`` is the raw ``/board`` projection dict when this process
|
|
2403
|
+
is a thin client (``board_service`` configured) — it carries sibling
|
|
2404
|
+
keys (``fleet_health``, ...) a bare :class:`Board` does not — and
|
|
2405
|
+
``None`` when reading the local DB/daemon-host path directly, since
|
|
2406
|
+
there is no daemon payload to share in that mode.
|
|
2407
|
+
"""
|
|
2408
|
+
from coord import board_service # noqa: PLC0415
|
|
2409
|
+
|
|
2410
|
+
svc = board_service.resolve()
|
|
2411
|
+
if svc is not None:
|
|
2412
|
+
from coord.client import board_from_payload, fetch_board_payload # noqa: PLC0415
|
|
2413
|
+
|
|
2414
|
+
payload = fetch_board_payload(svc)
|
|
2415
|
+
return board_from_payload(payload), payload
|
|
2416
|
+
return read_board(), None
|
|
2417
|
+
|
|
2418
|
+
def _memoized_board_and_payload(): # -> tuple[Board, dict | None]
|
|
2419
|
+
"""``(board, payload)``, rebuilt at most once per ``_BOARD_MEMO_TTL_S``.
|
|
2420
|
+
|
|
2421
|
+
The ONE read every board-shaped handler below goes through —
|
|
2422
|
+
``_read_board()``, ``_read_board_and_machine_health()`` and
|
|
2423
|
+
``_read_fleet_health()`` all call this rather than each doing their
|
|
2424
|
+
own ``read_board()``/``fetch_board_payload()`` (#3295: "one question,
|
|
2425
|
+
one answer" applies to *how the data is obtained*, not just what it
|
|
2426
|
+
says). A short TTL rather than invalidate-on-write: long enough to
|
|
2427
|
+
collapse a burst of requests (one screen load, one SSE tick) into a
|
|
2428
|
+
single build, short enough that no panel is ever more than ~2s
|
|
2429
|
+
behind the DB/daemon.
|
|
2430
|
+
"""
|
|
2431
|
+
now = time.monotonic()
|
|
2432
|
+
if _board_memo["board"] is not None and (now - _board_memo["at"]) < _BOARD_MEMO_TTL_S:
|
|
2433
|
+
return _board_memo["board"], _board_memo["payload"]
|
|
2434
|
+
board, payload = _fetch_board_and_payload()
|
|
2435
|
+
_board_memo.update(at=now, board=board, payload=payload)
|
|
2436
|
+
return board, payload
|
|
2437
|
+
|
|
2381
2438
|
def _read_board():
|
|
2382
|
-
"""The board for this request — seeded fixture or the live DB/daemon.
|
|
2439
|
+
"""The board for this request — seeded fixture or the memoized live DB/daemon.
|
|
2383
2440
|
|
|
2384
2441
|
Fixture mode rebuilds the Board from the raw payload on every call, so
|
|
2385
2442
|
a handler that mutates what it is handed (``unstick`` →
|
|
2386
|
-
``mark_failed_by_id``) can't leak that into the next request.
|
|
2443
|
+
``mark_failed_by_id``) can't leak that into the next request. Live
|
|
2444
|
+
mode goes through :func:`_memoized_board_and_payload` (#3295).
|
|
2387
2445
|
"""
|
|
2388
2446
|
if _fixture is not None:
|
|
2389
2447
|
return _fixture.board()
|
|
2390
|
-
|
|
2448
|
+
board, _payload = _memoized_board_and_payload()
|
|
2449
|
+
return board
|
|
2391
2450
|
|
|
2392
2451
|
def _write_board(board) -> None: # noqa: ANN001
|
|
2393
|
-
"""Persist *board* — a no-op in fixture mode (writes never execute).
|
|
2452
|
+
"""Persist *board* — a no-op in fixture mode (writes never execute).
|
|
2453
|
+
|
|
2454
|
+
Invalidates the #3295 board memo rather than repopulating it with
|
|
2455
|
+
*board*: in thin-client mode the write only carries the mutated
|
|
2456
|
+
`Board`, not a fresh daemon payload (`fleet_health` et al.), so
|
|
2457
|
+
keeping a stale/partial cache entry around risks a subsequent
|
|
2458
|
+
`_read_fleet_health()`/`_read_board_and_machine_health()` call
|
|
2459
|
+
serving an empty block instead of paying for one more real read.
|
|
2460
|
+
"""
|
|
2394
2461
|
if _fixture is not None:
|
|
2395
2462
|
return
|
|
2396
2463
|
write_board(board)
|
|
2464
|
+
_board_memo.update(at=0.0, board=None, payload=None)
|
|
2397
2465
|
|
|
2398
2466
|
def _read_board_and_machine_health() -> tuple: # -> tuple[Board, dict[str, dict]]
|
|
2399
2467
|
"""The board plus every configured machine's latest daemon-tick-
|
|
@@ -2423,16 +2491,19 @@ def build_app(
|
|
|
2423
2491
|
install, or nothing has ticked the health refresher yet) — callers
|
|
2424
2492
|
must treat that the same as an ``unknown`` state, never as healthy
|
|
2425
2493
|
(#1485's failure mode).
|
|
2494
|
+
|
|
2495
|
+
#3295: the thin-client branch now reads through
|
|
2496
|
+
:func:`_memoized_board_and_payload` instead of calling
|
|
2497
|
+
``fetch_board_payload`` itself — sharing the SAME daemon round trip
|
|
2498
|
+
``_read_fleet_health()`` (and ``_read_board()``) make within the
|
|
2499
|
+
memo window, rather than each paying for its own.
|
|
2426
2500
|
"""
|
|
2427
2501
|
from coord import board_service # noqa: PLC0415
|
|
2428
2502
|
|
|
2429
2503
|
svc = board_service.resolve()
|
|
2430
2504
|
if svc is not None:
|
|
2431
|
-
|
|
2432
|
-
|
|
2433
|
-
payload = fetch_board_payload(svc)
|
|
2434
|
-
board = board_from_payload(payload)
|
|
2435
|
-
rows = (payload.get("fleet_health") or {}).get("machine_health") or []
|
|
2505
|
+
board, payload = _memoized_board_and_payload()
|
|
2506
|
+
rows = ((payload or {}).get("fleet_health") or {}).get("machine_health") or []
|
|
2436
2507
|
return board, {row["machine"]: row for row in rows}
|
|
2437
2508
|
|
|
2438
2509
|
from coord.health.fleet_snapshot import machine_health_rows # noqa: PLC0415
|
|
@@ -2494,15 +2565,19 @@ def build_app(
|
|
|
2494
2565
|
``coord status``. Per-machine severities still come from the same
|
|
2495
2566
|
row-assembly the thin-client path rides (``machine_health_rows``), so
|
|
2496
2567
|
the two modes can't drift on that half.
|
|
2568
|
+
|
|
2569
|
+
#3295: the thin-client branch reads through
|
|
2570
|
+
:func:`_memoized_board_and_payload` — the same memo
|
|
2571
|
+
``_read_board_and_machine_health()`` reads through — instead of
|
|
2572
|
+
issuing its own ``fetch_board_payload`` call, so the two no longer
|
|
2573
|
+
double the daemon I/O a single request burst costs.
|
|
2497
2574
|
"""
|
|
2498
2575
|
from coord import board_service # noqa: PLC0415
|
|
2499
2576
|
|
|
2500
2577
|
svc = board_service.resolve()
|
|
2501
2578
|
if svc is not None:
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
payload = fetch_board_payload(svc)
|
|
2505
|
-
return payload.get("fleet_health") or dict(_EMPTY_FLEET_HEALTH_BLOCK)
|
|
2579
|
+
_board, payload = _memoized_board_and_payload()
|
|
2580
|
+
return (payload or {}).get("fleet_health") or dict(_EMPTY_FLEET_HEALTH_BLOCK)
|
|
2506
2581
|
|
|
2507
2582
|
from coord.health.aggregate import local_fleet_health_block # noqa: PLC0415
|
|
2508
2583
|
|
|
@@ -2746,12 +2821,21 @@ def build_app(
|
|
|
2746
2821
|
_sessions_offline_since: dict[str, float] = {}
|
|
2747
2822
|
|
|
2748
2823
|
async def _background_poller() -> None:
|
|
2749
|
-
"""Runs forever; polls agents every _POLL_INTERVAL seconds.
|
|
2824
|
+
"""Runs forever; polls agents every _POLL_INTERVAL seconds.
|
|
2825
|
+
|
|
2826
|
+
#3295: passes its own board read through the shared
|
|
2827
|
+
``_read_board()``/memo rather than letting ``_poll_once`` fall back
|
|
2828
|
+
to its own bare ``read_board()`` — a tick landing inside a client's
|
|
2829
|
+
own ``/api/board`` poll window reuses that build instead of paying
|
|
2830
|
+
for a second one, and the tick's own build is then what the very
|
|
2831
|
+
next client poll reuses.
|
|
2832
|
+
"""
|
|
2750
2833
|
await asyncio.sleep(10) # Short initial delay so the server is ready
|
|
2751
2834
|
while True:
|
|
2752
2835
|
try:
|
|
2753
2836
|
possibly_stuck = await _poll_once(
|
|
2754
2837
|
config, event_source, _seen_terminal, _orphaned_since,
|
|
2838
|
+
board=_read_board(),
|
|
2755
2839
|
needs_attention_seen=_needs_attention_seen,
|
|
2756
2840
|
)
|
|
2757
2841
|
event_source.publish(BOARD_UPDATED, {
|
|
@@ -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`
|