code-coordinator 0.5.568__tar.gz → 0.5.570__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.568 → code_coordinator-0.5.570}/PKG-INFO +1 -1
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/scm_file_list.json +1 -0
- code_coordinator-0.5.570/code_coordinator.egg-info/scm_version.json +8 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/drive_queue.py +111 -9
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/report.py +174 -3
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/config.py +43 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/server.py +134 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/drive_queue.py +56 -23
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/reports.py +560 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_drive_queue.py +107 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive.py +16 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue.py +181 -0
- code_coordinator-0.5.570/tests/test_report_public_export.py +657 -0
- code_coordinator-0.5.568/code_coordinator.egg-info/scm_version.json +0 -8
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.gitignore +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/CLAUDE.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/GOAL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/LICENSE +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/MANIFEST.in +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/README.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/__init__.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agent.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/audit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/backup.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/block_log.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/board_service.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/brain.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/bugbash.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/claim.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/claude_setup_token.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/cli.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/client.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/codegen.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/bugbash.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/ci.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/comments.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dao.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/reports.html +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/db.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deps.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dispatch_liveness.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/drive.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/drive_sessions_snapshot.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/events.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/failure_classifier.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/filelock.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/freshness.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gates.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/goal.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gtk_native_driver.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/local_machine_identity.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/context.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/models.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/render.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/units.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/hooks.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/interactive.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/invariant_alarms.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/mac_native_driver.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/machine_fault.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/models.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/network.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notify.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/openapi.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/parentage.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/plans.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/progress.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/release_gate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/release_window.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/restart_cmd.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/review.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/self_health.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/smoke.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/smoke_tags.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/split_work.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/sql.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/state.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/test_author.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/test_report.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/tui_pty_driver.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/usage.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/win_native_bridge.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/win_native_driver.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/install-agent.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/pyproject.toml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/setup.cfg +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/__init__.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/backends.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/conftest.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_bugbash.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_claude_setup_token.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_ci.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_issues.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_invariant_alarms.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_machine_fault.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_retried_3340.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_supervisor_3366.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_client.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_effective.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_reports.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_db.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dispatch_liveness.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dispatch_workers.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_machine_fault.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_max_parallel_config.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_sessions_snapshot.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_events.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_failure_classifier.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fix_escalation_classifier.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gtk_native_driver.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_housekeeping.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_init.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_install_agent_capabilities_3515.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_invariant_alarms.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_mac_native_driver.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_machine_fault.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_models.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_network.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_cordon_drain_stall_3336.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_gate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_max_parallel_3423.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_restart_cmd.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_retry_escalation_classify_3360.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_session.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_smoke_fanout_manifest_3333.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_split.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_state.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_tui_pty_driver.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_win_native_bridge.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_win_native_driver.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/write_parity.py +0 -0
|
@@ -812,6 +812,7 @@ tests/test_repo_edit_2220.py
|
|
|
812
812
|
tests/test_repo_graph_fleet_2237.py
|
|
813
813
|
tests/test_repo_max_parallel_3423.py
|
|
814
814
|
tests/test_repo_onboard_2220.py
|
|
815
|
+
tests/test_report_public_export.py
|
|
815
816
|
tests/test_report_result_push.py
|
|
816
817
|
tests/test_reports.py
|
|
817
818
|
tests/test_restart_cmd.py
|
{code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -839,6 +839,7 @@
|
|
|
839
839
|
"tests/test_repo_graph_fleet_2237.py",
|
|
840
840
|
"tests/test_repo_max_parallel_3423.py",
|
|
841
841
|
"tests/test_repo_onboard_2220.py",
|
|
842
|
+
"tests/test_report_public_export.py",
|
|
842
843
|
"tests/test_report_result_push.py",
|
|
843
844
|
"tests/test_reports.py",
|
|
844
845
|
"tests/test_restart_cmd.py",
|
|
@@ -485,6 +485,7 @@ def drive_queue_add(
|
|
|
485
485
|
# kind is happening on that path. Merging (or fixing forward) a
|
|
486
486
|
# discovered PR is deliberately left to the operator — see
|
|
487
487
|
# `existing_pr_relaunch_remedy`'s own docstring.
|
|
488
|
+
existing_pr_resume_note = ""
|
|
488
489
|
if previous is None or previous.state in STUCK_QUEUE_STATES:
|
|
489
490
|
existing_match = _existing_pr_match(config_path, repo, issue)
|
|
490
491
|
existing_remedy = existing_pr_relaunch_remedy(repo, issue, existing_match)
|
|
@@ -494,6 +495,24 @@ def drive_queue_add(
|
|
|
494
495
|
f"{existing_remedy['what_happens']} Run instead: "
|
|
495
496
|
f"{existing_remedy['command_or_action']}"
|
|
496
497
|
)
|
|
498
|
+
# #3539: `existing_remedy is None` with a real *existing_match* is
|
|
499
|
+
# ambiguous on its own — "no PR found, start fresh" and "PR found,
|
|
500
|
+
# green, but still missing a gate — resume on it" both return
|
|
501
|
+
# `None` from `existing_pr_relaunch_remedy` (see its docstring).
|
|
502
|
+
# Say which one happened: silently queuing a resume with no echo
|
|
503
|
+
# at all would read identically to a fresh `add` and hide the exact
|
|
504
|
+
# trap #3539 reports (an operator with no way to tell this add is
|
|
505
|
+
# about to drive the SAME branch, not a new one).
|
|
506
|
+
if existing_match is not None and existing_match.missing_gates:
|
|
507
|
+
gates_list = " and ".join(existing_match.missing_gates)
|
|
508
|
+
existing_pr_resume_note = (
|
|
509
|
+
f"\nresuming on existing PR #{existing_match.number} "
|
|
510
|
+
f"({existing_match.branch}) — CI is green but {gates_list} "
|
|
511
|
+
f"{'gate is' if len(existing_match.missing_gates) == 1 else 'gates are'} "
|
|
512
|
+
"not yet recorded; this add will dispatch only the missing "
|
|
513
|
+
f"stage(s) on that branch, never a new Work leg (coord "
|
|
514
|
+
f"gates {repo} {issue} shows the live detail)."
|
|
515
|
+
)
|
|
497
516
|
|
|
498
517
|
# #2247: predicted file overlap ORDERS, never refuses. Anything that goes
|
|
499
518
|
# wrong in here (unreadable body, unreachable board, a failed compare)
|
|
@@ -645,6 +664,7 @@ def drive_queue_add(
|
|
|
645
664
|
click.echo(
|
|
646
665
|
f"queued {entry_key(repo, issue)}{pinned}{suffix}{gate}{fix_rounds_note}"
|
|
647
666
|
f"{no_acceptance_note}{scope_downgrade_warning}{overlap_note}"
|
|
667
|
+
f"{existing_pr_resume_note}"
|
|
648
668
|
)
|
|
649
669
|
|
|
650
670
|
# #2339: say out loud when this add cannot possibly accomplish anything —
|
|
@@ -951,15 +971,32 @@ def _existing_pr_match(
|
|
|
951
971
|
answer than `coord.merge_queue.plan()`'s own `PLAN_READY` verdict — it
|
|
952
972
|
reads raw `failed_checks`/`in_flight_checks` only and does not account
|
|
953
973
|
for `merge_queue._ci_checks_are_stale` (a green check that silently
|
|
954
|
-
outlived a base move)
|
|
955
|
-
|
|
956
|
-
--
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
974
|
+
outlived a base move). The issue's own design accepted either condition
|
|
975
|
+
("all green OR `coord merge --plan` reads READY"), and `coord merge
|
|
976
|
+
--only` re-runs its own full gate check before actually merging either
|
|
977
|
+
way, so the worst case from the gap is a confusing round trip
|
|
978
|
+
(recommended here, still BLOCKED there), never an incorrect merge.
|
|
979
|
+
Wiring the fuller verdict in would need this call site to assemble
|
|
980
|
+
`plan()`'s board/GhOps/smoke-verdict inputs for a single PR lookup — a
|
|
981
|
+
bigger, riskier change than this fix-round's scope; left as a known gap
|
|
982
|
+
rather than attempted half-wired.
|
|
983
|
+
|
|
984
|
+
`missing_gates` (#3539), unlike `all_green`, DOES reuse the real gate
|
|
985
|
+
decision — `coord.gates.build_gate_report`, the exact function `coord
|
|
986
|
+
gates` prints and that wraps `coord.merge_queue`'s own
|
|
987
|
+
`requires_review`/`scan_approved_reviews`/`requires_smoke`/
|
|
988
|
+
`evaluate_smoke_verdict` — rather than a second guess, closing the
|
|
989
|
+
quadraui#1109 gap: a PR can be all-green on CI while `coord gates`
|
|
990
|
+
still reports `review`/`test` BLOCKED, and the #2377 guard's old
|
|
991
|
+
"merge it" advice for an all-green PR was then impossible (`coord merge
|
|
992
|
+
--only` itself refused with `enqueue blocked by review gate`). Only
|
|
993
|
+
computed when `all_green` — a red PR's gate state is moot, the caller
|
|
994
|
+
refuses on CI alone either way. Fails open toward "missing" (NEVER
|
|
995
|
+
toward "satisfied"): an unreadable board/config, or a PR whose work
|
|
996
|
+
chain `build_gate_report` can't resolve a decision for, reports every
|
|
997
|
+
gate as still missing rather than claiming a merge is ready when a live
|
|
998
|
+
`coord merge --only` might still refuse it (#2096: unconfirmed success
|
|
999
|
+
is a defect).
|
|
963
1000
|
"""
|
|
964
1001
|
coordinates = _repo_coordinates(config_path, repo)
|
|
965
1002
|
if coordinates is None:
|
|
@@ -990,14 +1027,64 @@ def _existing_pr_match(
|
|
|
990
1027
|
# reported", which `all_green` below already reads as not-green.
|
|
991
1028
|
checks = []
|
|
992
1029
|
all_green = bool(checks) and not failed_checks(checks) and not in_flight_checks(checks)
|
|
1030
|
+
missing_gates = _missing_required_gates(config_path, repo, issue) if all_green else ()
|
|
993
1031
|
return ExistingPrMatch(
|
|
994
1032
|
number=number,
|
|
995
1033
|
branch=str(pr.get("headRefName") or ""),
|
|
996
1034
|
url=str(pr.get("url") or ""),
|
|
997
1035
|
all_green=all_green,
|
|
1036
|
+
missing_gates=missing_gates,
|
|
998
1037
|
)
|
|
999
1038
|
|
|
1000
1039
|
|
|
1040
|
+
def _missing_required_gates(config_path: Path, repo: str, issue: int) -> tuple[str, ...]:
|
|
1041
|
+
"""#3539: which of ``("review", "test")`` are still required-but-not-ok
|
|
1042
|
+
for *repo*#*issue*, per `coord.gates.build_gate_report` — the SAME
|
|
1043
|
+
review/test decision `coord gates` prints and `coord merge` itself
|
|
1044
|
+
gates on (#2096: one question, one answer; never a second, driftable
|
|
1045
|
+
guess at "is this PR actually ready").
|
|
1046
|
+
|
|
1047
|
+
Fails open toward "missing", never toward "satisfied": any read failure
|
|
1048
|
+
(unreadable config, no board, an exception inside `build_gate_report`
|
|
1049
|
+
itself) or a report with no resolved decisions at all (no work-like
|
|
1050
|
+
assignment `build_gate_report` could select a winner from) reports
|
|
1051
|
+
BOTH gates missing. A false "missing" here costs one operator-visible
|
|
1052
|
+
resume note on an add that may turn out to be a no-op once the real
|
|
1053
|
+
gates are read live again a moment later; a false "satisfied" would
|
|
1054
|
+
reproduce the exact #3539 incident — advising ``coord merge --only``
|
|
1055
|
+
over a PR a live merge attempt still refuses.
|
|
1056
|
+
|
|
1057
|
+
The board comes from ``coord.board_service.read_board()``, NOT
|
|
1058
|
+
``coord.state.build_board()`` (#615/#906): `coord drive-queue add` has
|
|
1059
|
+
no whole-command daemon reroute, so a thin client reading the local DB
|
|
1060
|
+
here would see an empty board, resolve no decisions, and fail open to
|
|
1061
|
+
"both gates missing" on every add — technically safe, uselessly noisy.
|
|
1062
|
+
`read_board()` is the one place the local-vs-daemon decision is made
|
|
1063
|
+
(GET /board on a thin client, the local DB otherwise), which is also
|
|
1064
|
+
why no entry is needed in `tests/test_thin_client_board_audit.py`'s
|
|
1065
|
+
``COMMANDS_ALLOWLIST``: there is no direct local-board call site to
|
|
1066
|
+
allowlist.
|
|
1067
|
+
"""
|
|
1068
|
+
try:
|
|
1069
|
+
from coord import github_ops # noqa: PLC0415
|
|
1070
|
+
from coord.board_service import read_board # noqa: PLC0415
|
|
1071
|
+
from coord.commands._common import _load_config # noqa: PLC0415
|
|
1072
|
+
from coord.gates import build_gate_report # noqa: PLC0415
|
|
1073
|
+
|
|
1074
|
+
cfg = _load_config(config_path)
|
|
1075
|
+
board = read_board()
|
|
1076
|
+
report = build_gate_report(board, cfg, repo, issue, gh_ops=github_ops)
|
|
1077
|
+
except (Exception, SystemExit): # noqa: BLE001 — fail-open to "missing"
|
|
1078
|
+
return ("review", "test")
|
|
1079
|
+
by_gate = {d.gate: d for d in report.decisions}
|
|
1080
|
+
missing = []
|
|
1081
|
+
for gate in ("review", "test"):
|
|
1082
|
+
decision = by_gate.get(gate)
|
|
1083
|
+
if decision is None or (decision.required and not decision.ok):
|
|
1084
|
+
missing.append(gate)
|
|
1085
|
+
return tuple(missing)
|
|
1086
|
+
|
|
1087
|
+
|
|
1001
1088
|
def _predict_overlap(
|
|
1002
1089
|
config_path: Path, repo: str, issue: int, existing_entries: list[QueueEntry],
|
|
1003
1090
|
) -> tuple[Prediction, str, str]:
|
|
@@ -6433,6 +6520,17 @@ def _blocked_escalation_command(
|
|
|
6433
6520
|
behaviour) purely so every OTHER existing caller/test of this function
|
|
6434
6521
|
that has no config to hand keeps working unchanged; the real `tick`
|
|
6435
6522
|
call sites below always pass their own.
|
|
6523
|
+
|
|
6524
|
+
#3539: `existing_pr_relaunch_remedy` returning ``None`` is no longer
|
|
6525
|
+
proof that *match* itself is ``None`` — a green PR with Test and/or
|
|
6526
|
+
Review never recorded ALSO returns ``None`` (see that function's own
|
|
6527
|
+
docstring), on purpose, so a plain `add` can resume on it. That case
|
|
6528
|
+
still HAS a PR and HAS been dispatched, so it must not fall through to
|
|
6529
|
+
`_requeue_command`'s blind ``remove && add`` either — remove would
|
|
6530
|
+
discard a completed, green work cycle for no reason. Propose the plain
|
|
6531
|
+
`add` (no `remove` first) instead; `_requeue_command` stays reserved for
|
|
6532
|
+
the one case its own docstring names: *match* itself is ``None``,
|
|
6533
|
+
i.e. nothing was ever dispatched for this row at all.
|
|
6436
6534
|
"""
|
|
6437
6535
|
if is_merge_gate_block_reason(reason):
|
|
6438
6536
|
parsed = parse_key(key)
|
|
@@ -6446,6 +6544,10 @@ def _blocked_escalation_command(
|
|
|
6446
6544
|
remedy = existing_pr_relaunch_remedy(repo, issue, match)
|
|
6447
6545
|
if remedy is not None:
|
|
6448
6546
|
return remedy["command_or_action"]
|
|
6547
|
+
if match is not None:
|
|
6548
|
+
# #3539: green PR, gate(s) not yet recorded — resume via a
|
|
6549
|
+
# plain `add`, never the blind `remove && add` requeue below.
|
|
6550
|
+
return f"coord drive-queue add {repo} {issue}"
|
|
6449
6551
|
return _requeue_command(entry, key)
|
|
6450
6552
|
|
|
6451
6553
|
|
|
@@ -26,10 +26,34 @@ why ``started_at`` exports as an epoch (or a real Excel datetime cell for
|
|
|
26
26
|
extra rather than a crash. ``--json`` survives as a hidden alias for
|
|
27
27
|
``--format json``.
|
|
28
28
|
|
|
29
|
+
``coord report export <id> --public`` (#3474) runs a report the same way
|
|
30
|
+
``report run`` does (``coord.state.run_report`` — daemon when
|
|
31
|
+
``board_service`` is set, local registry otherwise) and then redacts it for
|
|
32
|
+
an audience OUTSIDE the fleet, via :func:`coord.reports.redact_report_for_public`:
|
|
33
|
+
every repo not named in ``coordinator.yml``'s ``reporting.public.allowlist_
|
|
34
|
+
repos`` is dropped and folded into one aggregate ``"private repo"`` row —
|
|
35
|
+
no name, no issue number, no title. The result is written as a
|
|
36
|
+
self-contained ``.public.html`` (data inlined, chart on a pinned ECharts
|
|
37
|
+
CDN) plus the same redacted ``.public.csv`` into ``--out`` (default: the
|
|
38
|
+
current directory). A report whose dollar figure has no stated cost basis
|
|
39
|
+
left standing after redaction is refused outright (``PublicExportError``) —
|
|
40
|
+
"a public number with no stated basis is not produced" (#3474). The
|
|
41
|
+
redaction itself runs **client-side**, over the already-fetched result —
|
|
42
|
+
same precedent as every ``--format`` above, which also serialises
|
|
43
|
+
client-side over ``run_report``'s own return value — so a thin client never
|
|
44
|
+
needs a second, DB-backed export path. The allowlist that drives it,
|
|
45
|
+
though, is resolved via :func:`_resolve_public_allowlist` — the same
|
|
46
|
+
thin-client-first ``board_service``/``fetch_remote_config`` seam
|
|
47
|
+
``coord.commands._common._load_config`` uses for every other config read
|
|
48
|
+
(#1080/#947/#2824), never a raw local ``coordinator.yml`` load: the
|
|
49
|
+
allowlist is the one input here that is explicitly security-sensitive, so
|
|
50
|
+
a thin client with a stale local copy must never under-redact against it.
|
|
51
|
+
|
|
29
52
|
Exit codes: ``2`` for a bad request (unknown report, unknown parameter, bad
|
|
30
|
-
value,
|
|
31
|
-
|
|
32
|
-
|
|
53
|
+
value, ``--format xlsx`` without the extra installed, or a public export
|
|
54
|
+
refused over an unstated cost basis — the message names what was
|
|
55
|
+
allowed/needed), ``1`` for a read/transport failure. Never a traceback for
|
|
56
|
+
either.
|
|
33
57
|
"""
|
|
34
58
|
|
|
35
59
|
from __future__ import annotations
|
|
@@ -43,6 +67,36 @@ import click
|
|
|
43
67
|
|
|
44
68
|
from coord.commands._common import _CONFIG_OPTION
|
|
45
69
|
|
|
70
|
+
|
|
71
|
+
def _resolve_public_allowlist(config_path) -> frozenset[str]: # noqa: ANN001
|
|
72
|
+
"""The thin-client-safe ``reporting.public.allowlist_repos`` for
|
|
73
|
+
``coord report export --public`` (#3474 review).
|
|
74
|
+
|
|
75
|
+
Mirrors :func:`coord.commands._common._load_config`'s "thin client
|
|
76
|
+
first" resolution — a machine with ``board_service``/``client.toml``
|
|
77
|
+
configured fetches the DAEMON's live config (``fetch_remote_config``)
|
|
78
|
+
rather than trusting whatever ``coordinator.yml`` happens to sit on
|
|
79
|
+
local disk, the exact bug class #1080/#947/#2824 already paid for
|
|
80
|
+
(a stale/stray local file silently diverging from the daemon's real
|
|
81
|
+
config with no signal anything is wrong). ``_load_config`` itself
|
|
82
|
+
``sys.exit(2)``s on a bad config, which is right for every OTHER
|
|
83
|
+
command but wrong here: the allowlist is the one input this feature
|
|
84
|
+
treats as security-sensitive, so a failure to resolve it (daemon
|
|
85
|
+
unreachable, local file malformed/absent) must fail SOFT — the caller
|
|
86
|
+
catches whatever this raises and falls back to the empty allowlist,
|
|
87
|
+
i.e. "redact everything" (same posture as the daemon-side sibling,
|
|
88
|
+
:func:`coord.reports.load_public_allowlist`).
|
|
89
|
+
"""
|
|
90
|
+
from coord.client import fetch_remote_config, resolve_board_service # noqa: PLC0415
|
|
91
|
+
from coord.config import load as load_config # noqa: PLC0415
|
|
92
|
+
|
|
93
|
+
path = config_path
|
|
94
|
+
svc = resolve_board_service()
|
|
95
|
+
if svc is not None:
|
|
96
|
+
path = fetch_remote_config(svc)
|
|
97
|
+
return frozenset(load_config(path).reporting.public.allowlist_repos)
|
|
98
|
+
|
|
99
|
+
|
|
46
100
|
# Row keys whose values are epoch timestamps — rendered as a relative age in
|
|
47
101
|
# the human table (absolute in --json, which is the machine contract).
|
|
48
102
|
# Fallback only: used when a row column is not covered by the report's
|
|
@@ -372,3 +426,120 @@ def report_run(
|
|
|
372
426
|
click.echo(f"notes ({len(notes)}):")
|
|
373
427
|
for note in notes:
|
|
374
428
|
click.echo(f" • {note}")
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
@report_group.command(
|
|
432
|
+
"export",
|
|
433
|
+
help="Export a report for sharing outside the fleet (#3474; --public is required today).",
|
|
434
|
+
)
|
|
435
|
+
@click.argument("report_id")
|
|
436
|
+
@click.option(
|
|
437
|
+
"--param", "raw_params", multiple=True, metavar="KEY=VALUE",
|
|
438
|
+
help="Report parameter, repeatable (e.g. --param since=13h).",
|
|
439
|
+
)
|
|
440
|
+
@click.option(
|
|
441
|
+
"--public", is_flag=True, default=False,
|
|
442
|
+
help=(
|
|
443
|
+
"Redact every repo not in coordinator.yml's "
|
|
444
|
+
"reporting.public.allowlist_repos before exporting — everything "
|
|
445
|
+
"else is aggregated into one 'private repo' row with no name, "
|
|
446
|
+
"issue number or title. The only export mode supported today; "
|
|
447
|
+
"omitting this flag is a usage error rather than silently "
|
|
448
|
+
"producing an un-redacted export."
|
|
449
|
+
),
|
|
450
|
+
)
|
|
451
|
+
@click.option(
|
|
452
|
+
"--out", "out_dir", type=click.Path(path_type=Path), default=Path("."),
|
|
453
|
+
show_default=True,
|
|
454
|
+
help="Directory to write the exported <report>.public.html/.csv pair into.",
|
|
455
|
+
)
|
|
456
|
+
@_CONFIG_OPTION
|
|
457
|
+
def report_export(
|
|
458
|
+
report_id: str,
|
|
459
|
+
raw_params: tuple[str, ...],
|
|
460
|
+
public: bool,
|
|
461
|
+
out_dir: Path,
|
|
462
|
+
config_path: Path,
|
|
463
|
+
) -> None:
|
|
464
|
+
if not public:
|
|
465
|
+
click.echo(
|
|
466
|
+
"error: `coord report export` needs --public today — a "
|
|
467
|
+
"self-contained, redacted HTML+CSV pair for sharing outside the "
|
|
468
|
+
"fleet (#3474). There is no un-redacted export mode.",
|
|
469
|
+
err=True,
|
|
470
|
+
)
|
|
471
|
+
raise SystemExit(2)
|
|
472
|
+
|
|
473
|
+
from coord.reports import ( # noqa: PLC0415
|
|
474
|
+
REPORTS,
|
|
475
|
+
PublicExportError,
|
|
476
|
+
assert_public_export_allowed,
|
|
477
|
+
public_csv_filename,
|
|
478
|
+
public_html_filename,
|
|
479
|
+
redact_report_for_public,
|
|
480
|
+
result_to_csv,
|
|
481
|
+
result_to_public_html,
|
|
482
|
+
)
|
|
483
|
+
from coord.state import run_report # noqa: PLC0415
|
|
484
|
+
|
|
485
|
+
params: dict[str, str] = {}
|
|
486
|
+
for raw in raw_params:
|
|
487
|
+
if "=" not in raw:
|
|
488
|
+
click.echo(
|
|
489
|
+
f"error: --param expects KEY=VALUE, got {raw!r} "
|
|
490
|
+
"(e.g. --param since=13h)",
|
|
491
|
+
err=True,
|
|
492
|
+
)
|
|
493
|
+
raise SystemExit(2)
|
|
494
|
+
key, _, value = raw.partition("=")
|
|
495
|
+
params[key.strip()] = value
|
|
496
|
+
|
|
497
|
+
try:
|
|
498
|
+
result = run_report(report_id, params)
|
|
499
|
+
except ValueError as e:
|
|
500
|
+
# ReportError (local) or the daemon's 400/404 body, re-raised as a
|
|
501
|
+
# ValueError by coord.client.fetch_report — mirrors `report run`.
|
|
502
|
+
click.echo(f"error: {e}", err=True)
|
|
503
|
+
raise SystemExit(2) from e
|
|
504
|
+
except Exception as e: # noqa: BLE001 — transport/DB failure
|
|
505
|
+
click.echo(f"error: report run failed: {e}", err=True)
|
|
506
|
+
raise SystemExit(1) from e
|
|
507
|
+
|
|
508
|
+
# #3474: redaction runs HERE, client-side, over the already-fetched
|
|
509
|
+
# `result` — same precedent `--format csv|xlsx|...` above already sets
|
|
510
|
+
# (those also serialise client-side over `run_report`'s own return
|
|
511
|
+
# value), so a thin client never needs a second, DB-backed export path.
|
|
512
|
+
# The allowlist itself goes through `_resolve_public_allowlist` — the
|
|
513
|
+
# SAME thin-client-first resolution every other config read uses
|
|
514
|
+
# (#1080/#947/#2824), not a raw local-file load — so a thin client whose
|
|
515
|
+
# daemon has since tightened `reporting.public.allowlist_repos` can
|
|
516
|
+
# never under-redact from a stale local copy. Any failure to resolve it
|
|
517
|
+
# (daemon unreachable, local file malformed/absent — reports need no
|
|
518
|
+
# config at all for `list`/`run`) is NOT a usage error here: it falls
|
|
519
|
+
# back to the empty allowlist, i.e. redact everything, the only safe
|
|
520
|
+
# default for an export leaving the fleet.
|
|
521
|
+
try:
|
|
522
|
+
allowed = _resolve_public_allowlist(config_path)
|
|
523
|
+
except Exception as e: # noqa: BLE001 — fail CLOSED: unreadable/unreachable config => redact everything
|
|
524
|
+
click.echo(
|
|
525
|
+
f"warning: could not resolve reporting.public.allowlist_repos "
|
|
526
|
+
f"({e}) — redacting every repo.",
|
|
527
|
+
err=True,
|
|
528
|
+
)
|
|
529
|
+
allowed = frozenset()
|
|
530
|
+
|
|
531
|
+
report_def = REPORTS.get(report_id)
|
|
532
|
+
redacted = redact_report_for_public(result, allowed_repos=allowed, report=report_def)
|
|
533
|
+
try:
|
|
534
|
+
assert_public_export_allowed(redacted, report_id)
|
|
535
|
+
except PublicExportError as e:
|
|
536
|
+
click.echo(f"error: {e}", err=True)
|
|
537
|
+
raise SystemExit(2) from e
|
|
538
|
+
|
|
539
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
540
|
+
html_path = out_dir / public_html_filename(redacted)
|
|
541
|
+
csv_path = out_dir / public_csv_filename(redacted)
|
|
542
|
+
html_path.write_text(result_to_public_html(redacted), encoding="utf-8")
|
|
543
|
+
csv_path.write_text(result_to_csv(redacted), encoding="utf-8")
|
|
544
|
+
click.echo(f"wrote {html_path}")
|
|
545
|
+
click.echo(f"wrote {csv_path}")
|
|
@@ -1956,6 +1956,29 @@ class PricingConfig:
|
|
|
1956
1956
|
COST_BASIS_CHOICES = ("api_equivalent", "billed")
|
|
1957
1957
|
|
|
1958
1958
|
|
|
1959
|
+
@dataclass
|
|
1960
|
+
class PublicReportingConfig:
|
|
1961
|
+
"""``reporting.public:`` block (#3474) — the redaction policy for a
|
|
1962
|
+
report export meant to leave the fleet (``coord report export
|
|
1963
|
+
--public``, the dashboard's ``/reports`` "Share" button).
|
|
1964
|
+
|
|
1965
|
+
A public export is for an audience that must never see a private repo's
|
|
1966
|
+
name, issue titles or numbers — someone evaluating the tool, or
|
|
1967
|
+
marketing material quoting "cost per merged issue". ``allowlist_repos``
|
|
1968
|
+
is the only field: the coord-local repo names (as declared under
|
|
1969
|
+
``coordinator.yml``'s ``repos:``) that MAY be named verbatim in a public
|
|
1970
|
+
export. Every row about any other repo is redacted — aggregated into a
|
|
1971
|
+
single ``"private repo"`` row with no issue number, no title, and no
|
|
1972
|
+
repo name of its own (:func:`coord.reports.redact_report_for_public`).
|
|
1973
|
+
|
|
1974
|
+
Default is empty, i.e. **redact everything** — the safe default for a
|
|
1975
|
+
config that predates this block, or one that simply never opted a repo
|
|
1976
|
+
in.
|
|
1977
|
+
"""
|
|
1978
|
+
|
|
1979
|
+
allowlist_repos: tuple[str, ...] = ()
|
|
1980
|
+
|
|
1981
|
+
|
|
1959
1982
|
@dataclass
|
|
1960
1983
|
class ReportingConfig:
|
|
1961
1984
|
"""``reporting:`` block (#3471) — what a cost-bearing report's dollar
|
|
@@ -1980,9 +2003,13 @@ class ReportingConfig:
|
|
|
1980
2003
|
and the figure is real money charged — set it only when that is
|
|
1981
2004
|
actually true; this config does no verification of its own; it only
|
|
1982
2005
|
labels, on every report, what the operator asserts here.
|
|
2006
|
+
|
|
2007
|
+
``public`` (#3474) is the redaction policy for a report export that
|
|
2008
|
+
leaves the fleet entirely — see :class:`PublicReportingConfig`.
|
|
1983
2009
|
"""
|
|
1984
2010
|
|
|
1985
2011
|
cost_basis: str = "api_equivalent"
|
|
2012
|
+
public: PublicReportingConfig = field(default_factory=PublicReportingConfig)
|
|
1986
2013
|
|
|
1987
2014
|
|
|
1988
2015
|
@dataclass
|
|
@@ -5088,6 +5115,22 @@ def _parse_reporting(raw: Any) -> ReportingConfig:
|
|
|
5088
5115
|
+ ", ".join(COST_BASIS_CHOICES)
|
|
5089
5116
|
)
|
|
5090
5117
|
cfg.cost_basis = value
|
|
5118
|
+
if "public" in raw:
|
|
5119
|
+
public_raw = raw["public"]
|
|
5120
|
+
if public_raw is None:
|
|
5121
|
+
public_raw = {}
|
|
5122
|
+
if not isinstance(public_raw, dict):
|
|
5123
|
+
raise ConfigError("'reporting.public' must be a mapping")
|
|
5124
|
+
allowlist = public_raw.get("allowlist_repos", [])
|
|
5125
|
+
if allowlist is None:
|
|
5126
|
+
allowlist = []
|
|
5127
|
+
if not isinstance(allowlist, list) or not all(
|
|
5128
|
+
isinstance(x, str) for x in allowlist
|
|
5129
|
+
):
|
|
5130
|
+
raise ConfigError(
|
|
5131
|
+
"reporting.public.allowlist_repos must be a list of repo names"
|
|
5132
|
+
)
|
|
5133
|
+
cfg.public = PublicReportingConfig(allowlist_repos=tuple(allowlist))
|
|
5091
5134
|
return cfg
|
|
5092
5135
|
|
|
5093
5136
|
|
|
@@ -1820,6 +1820,59 @@ def openapi_spec() -> dict:
|
|
|
1820
1820
|
},
|
|
1821
1821
|
}
|
|
1822
1822
|
},
|
|
1823
|
+
"/api/report/{report_id}/public": {
|
|
1824
|
+
"get": {
|
|
1825
|
+
"summary": (
|
|
1826
|
+
"#3474: a redacted, self-contained export of a report "
|
|
1827
|
+
"for sharing OUTSIDE the fleet. Every repo not in "
|
|
1828
|
+
"coordinator.yml's reporting.public.allowlist_repos is "
|
|
1829
|
+
"aggregated into one 'private repo' row — no name, "
|
|
1830
|
+
"issue number or title. Refused with 400 when the "
|
|
1831
|
+
"report carries a cost figure but no cost-basis/"
|
|
1832
|
+
"coverage note survives redaction."
|
|
1833
|
+
),
|
|
1834
|
+
"parameters": [
|
|
1835
|
+
_dashboard_path_param("report_id", "report id from the catalogue"),
|
|
1836
|
+
{
|
|
1837
|
+
"name": "format",
|
|
1838
|
+
"in": "query",
|
|
1839
|
+
"required": False,
|
|
1840
|
+
"schema": {"type": "string", "enum": ["html", "csv"]},
|
|
1841
|
+
"description": (
|
|
1842
|
+
"Absent/`html` returns a self-contained static "
|
|
1843
|
+
"page (data inlined; a declared chart renders "
|
|
1844
|
+
"via a pinned ECharts CDN script). `csv` "
|
|
1845
|
+
"returns the identical redacted rows as "
|
|
1846
|
+
"text/csv. Both ship a Content-Disposition "
|
|
1847
|
+
"filename."
|
|
1848
|
+
),
|
|
1849
|
+
},
|
|
1850
|
+
],
|
|
1851
|
+
"responses": {
|
|
1852
|
+
"200": {
|
|
1853
|
+
"description": "OK",
|
|
1854
|
+
"content": {
|
|
1855
|
+
"text/html": {
|
|
1856
|
+
"schema": {"type": "string"},
|
|
1857
|
+
"description": "`?format=html` (default).",
|
|
1858
|
+
},
|
|
1859
|
+
"text/csv": {
|
|
1860
|
+
"schema": {"type": "string"},
|
|
1861
|
+
"description": "`?format=csv`.",
|
|
1862
|
+
},
|
|
1863
|
+
},
|
|
1864
|
+
},
|
|
1865
|
+
"400": {
|
|
1866
|
+
"description": (
|
|
1867
|
+
"Unknown parameter / bad parameter value / "
|
|
1868
|
+
"unknown format / an unstated cost basis "
|
|
1869
|
+
"refused the export"
|
|
1870
|
+
)
|
|
1871
|
+
},
|
|
1872
|
+
"404": {"description": "Unknown report id"},
|
|
1873
|
+
},
|
|
1874
|
+
}
|
|
1875
|
+
},
|
|
1823
1876
|
"/api/approve": {
|
|
1824
1877
|
"post": {
|
|
1825
1878
|
"summary": "Dispatch one or more proposals by id",
|
|
@@ -3721,6 +3774,82 @@ def build_app(
|
|
|
3721
3774
|
result.to_dict() if isinstance(result, _reports.ReportResult) else result
|
|
3722
3775
|
)
|
|
3723
3776
|
|
|
3777
|
+
async def api_report_export_public(request: Request) -> Response:
|
|
3778
|
+
"""GET /api/report/{report_id}/public?format=html|csv&... — a
|
|
3779
|
+
redacted, self-contained export for sharing OUTSIDE the fleet
|
|
3780
|
+
(#3474): the dashboard's ``/reports`` "Share" affordance and
|
|
3781
|
+
``coord report export --public`` both end up describing the exact
|
|
3782
|
+
same redaction, since both go through
|
|
3783
|
+
``coord.reports.redact_report_for_public`` — never a second,
|
|
3784
|
+
independently-drifting idea of what "public" means (#2096).
|
|
3785
|
+
|
|
3786
|
+
``format`` defaults to ``html`` (the self-contained page: data
|
|
3787
|
+
inlined, chart — if any — on a pinned ECharts CDN); ``csv`` returns
|
|
3788
|
+
the identical redacted rows as a download. Every repo not in the
|
|
3789
|
+
loaded ``coordinator.yml``'s ``reporting.public.allowlist_repos``
|
|
3790
|
+
is aggregated into one ``"private repo"`` row with no name, issue
|
|
3791
|
+
number or title. A cost-bearing report whose basis/coverage note
|
|
3792
|
+
did not survive redaction is refused with 400 — "a public number
|
|
3793
|
+
with no stated basis is not produced" (#3474).
|
|
3794
|
+
"""
|
|
3795
|
+
from starlette.concurrency import run_in_threadpool # noqa: PLC0415
|
|
3796
|
+
|
|
3797
|
+
from coord import reports as _reports # noqa: PLC0415
|
|
3798
|
+
|
|
3799
|
+
report_id = request.path_params["report_id"]
|
|
3800
|
+
params = dict(request.query_params)
|
|
3801
|
+
fmt = (params.pop("format", "") or "html").strip().lower()
|
|
3802
|
+
if fmt not in ("html", "csv"):
|
|
3803
|
+
return JSONResponse(
|
|
3804
|
+
{"error": f"unknown public export format {fmt!r} — allowed values: html, csv"},
|
|
3805
|
+
status_code=400,
|
|
3806
|
+
)
|
|
3807
|
+
try:
|
|
3808
|
+
if _fixture is not None:
|
|
3809
|
+
raw_result = _fixture.report_result(report_id, params)
|
|
3810
|
+
else:
|
|
3811
|
+
raw_result = await run_in_threadpool(_reports.run_report, report_id, params)
|
|
3812
|
+
except _reports.UnknownReportError as e:
|
|
3813
|
+
return JSONResponse({"error": str(e)}, status_code=404)
|
|
3814
|
+
except _reports.ReportError as e:
|
|
3815
|
+
return JSONResponse({"error": str(e)}, status_code=400)
|
|
3816
|
+
except Exception as e: # noqa: BLE001 — surface a clean 503 rather than a stack trace
|
|
3817
|
+
return JSONResponse(
|
|
3818
|
+
{"error": "report run failed", "detail": str(e)}, status_code=503
|
|
3819
|
+
)
|
|
3820
|
+
|
|
3821
|
+
report_def = _reports.REPORTS.get(report_id)
|
|
3822
|
+
# The app's own bound `config` (fixture or live — see `build_app`'s
|
|
3823
|
+
# own docstring), never a second, independent `coordinator.yml`
|
|
3824
|
+
# read off disk: fixture mode's "every read is answered from the
|
|
3825
|
+
# fixture" promise has to hold for the redaction policy too, not
|
|
3826
|
+
# just the report data being redacted.
|
|
3827
|
+
allowed = frozenset(config.reporting.public.allowlist_repos)
|
|
3828
|
+
redacted = await run_in_threadpool(
|
|
3829
|
+
_reports.redact_report_for_public,
|
|
3830
|
+
raw_result,
|
|
3831
|
+
allowed_repos=allowed,
|
|
3832
|
+
report=report_def,
|
|
3833
|
+
)
|
|
3834
|
+
try:
|
|
3835
|
+
_reports.assert_public_export_allowed(redacted, report_id)
|
|
3836
|
+
except _reports.PublicExportError as e:
|
|
3837
|
+
return JSONResponse({"error": str(e)}, status_code=400)
|
|
3838
|
+
|
|
3839
|
+
if fmt == "csv":
|
|
3840
|
+
body = await run_in_threadpool(_reports.result_to_csv, redacted)
|
|
3841
|
+
filename = _reports.public_csv_filename(redacted)
|
|
3842
|
+
media_type = "text/csv; charset=utf-8"
|
|
3843
|
+
else:
|
|
3844
|
+
body = await run_in_threadpool(_reports.result_to_public_html, redacted)
|
|
3845
|
+
filename = _reports.public_html_filename(redacted)
|
|
3846
|
+
media_type = "text/html; charset=utf-8"
|
|
3847
|
+
return Response(
|
|
3848
|
+
body,
|
|
3849
|
+
media_type=media_type,
|
|
3850
|
+
headers={"Content-Disposition": f'attachment; filename="{filename}"'},
|
|
3851
|
+
)
|
|
3852
|
+
|
|
3724
3853
|
async def api_approve(request: Request) -> JSONResponse:
|
|
3725
3854
|
from coord.dispatch import (
|
|
3726
3855
|
apply_liveness_reroute,
|
|
@@ -5666,6 +5795,11 @@ def build_app(
|
|
|
5666
5795
|
Route("/api/drive-queue/action", api_drive_queue_action, methods=["POST"]),
|
|
5667
5796
|
Route("/api/report", api_report_catalogue, methods=["GET"]),
|
|
5668
5797
|
Route("/api/report/{report_id}", api_report_run, methods=["GET"]),
|
|
5798
|
+
Route(
|
|
5799
|
+
"/api/report/{report_id}/public",
|
|
5800
|
+
api_report_export_public,
|
|
5801
|
+
methods=["GET"],
|
|
5802
|
+
),
|
|
5669
5803
|
Route("/api/approve", api_approve, methods=["POST"]),
|
|
5670
5804
|
Route("/api/reject", api_reject, methods=["POST"]),
|
|
5671
5805
|
Route("/api/diff/{id}", api_diff, methods=["GET"]),
|