code-coordinator 0.5.323__tar.gz → 0.5.325__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.323 → code_coordinator-0.5.325}/PKG-INFO +1 -1
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agent.py +4 -3
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/ci_fix.py +84 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/client.py +30 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/merge.py +108 -1
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/portal.py +175 -32
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/db.py +24 -2
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/merge_queue.py +36 -2
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/portal_store.py +29 -4
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/portal_sync.py +132 -26
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/serve_app.py +262 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ci_fix.py +312 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_portal.py +317 -2
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_db.py +1 -1
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_portal_store.py +191 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_sqlite_connect_ratchet.py +14 -2
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.gitignore +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/CLAUDE.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/GOAL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/LICENSE +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/MANIFEST.in +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/README.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/__init__.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/audit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/block_log.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/board_service.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/brain.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/claim.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/cli.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/comments.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/config.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dao.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deps.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/drive.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/events.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/filelock.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/freshness.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/gates.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/goal.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/context.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/models.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/render.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/units.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/hooks.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/interactive.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/models.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/network.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notify.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/openapi.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/parentage.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/plans.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/progress.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/release_window.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/reports.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/review.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/self_health.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/smoke.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/split_work.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/sql.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/state.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/test_author.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/test_report.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/usage.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/install-agent.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/pyproject.toml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/setup.cfg +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/__init__.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/backends.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/conftest.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_events.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_init.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_models.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_network.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_session.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_split.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_state.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/write_parity.py +0 -0
|
@@ -4178,9 +4178,10 @@ never this session's own.
|
|
|
4178
4178
|
- Do NOT run `git push`, `git commit`, or any command that writes to a repo \
|
|
4179
4179
|
checkout — this session files issues and queues work, it does not touch code.
|
|
4180
4180
|
- If an `enqueue-question`/`enqueue-status`/`decision` command refuses with \
|
|
4181
|
-
a thin-client error (this machine
|
|
4182
|
-
|
|
4183
|
-
|
|
4181
|
+
a thin-client error (this machine does not claim every repo the submission \
|
|
4182
|
+
maps to — #2995/#2751; it should not happen, since you were only dispatched \
|
|
4183
|
+
here because it does), say so explicitly to the operator rather than \
|
|
4184
|
+
silently dropping the Ask/Propose; do not retry it as some other command.
|
|
4184
4185
|
- Keep the operator informed: summarize your plan before writing anything, \
|
|
4185
4186
|
and report back what you asked/proposed/filed/queued/linked (and any gap) \
|
|
4186
4187
|
when done.\
|
|
@@ -50,6 +50,18 @@ _log = logging.getLogger(__name__)
|
|
|
50
50
|
# same exhausted budget the way an unbounded conflict-fix retry would.
|
|
51
51
|
MAX_CI_FIX_DISPATCHES = 2
|
|
52
52
|
|
|
53
|
+
# #3011: a ci-fix leg that finishes with the branch HEAD unchanged (see
|
|
54
|
+
# `dispatch_was_noop`) is refunded and does NOT count toward
|
|
55
|
+
# MAX_CI_FIX_DISPATCHES above — but that refund must itself be bounded, or
|
|
56
|
+
# two workers that keep (correctly) declining could cycle forever without
|
|
57
|
+
# ever reaching a verdict. Same magnitude as MAX_CI_FIX_DISPATCHES for the
|
|
58
|
+
# same "a couple of genuine signals is enough" reasoning: once this many
|
|
59
|
+
# CONSECUTIVE legs come back having pushed nothing, that itself is the
|
|
60
|
+
# verdict — the failure is not attributable to this branch — and
|
|
61
|
+
# `coord.commands.merge._dispatch_ci_fixes` escalates to HUMAN_REQUIRED
|
|
62
|
+
# with a reason that says so, distinct from the generic retry-cap message.
|
|
63
|
+
MAX_CI_FIX_NOOP_STREAK = 2
|
|
64
|
+
|
|
53
65
|
# Prefix on the dispatched fix worker's issue_title — mirrors
|
|
54
66
|
# `conflict_fix.SEMANTIC_FIX_TITLE_PREFIX`'s visibility purpose: the TUI
|
|
55
67
|
# Pipeline row and the fix briefing itself both make it obvious WHY this
|
|
@@ -123,6 +135,47 @@ def _has_active_fix(board: Board, entry: QueuedMerge) -> bool:
|
|
|
123
135
|
return False
|
|
124
136
|
|
|
125
137
|
|
|
138
|
+
def dispatch_was_noop(entry: QueuedMerge) -> bool:
|
|
139
|
+
"""True when the LAST ci-fix dispatch for *entry* completed with the
|
|
140
|
+
branch HEAD unchanged — the worker correctly concluded the CI failure
|
|
141
|
+
wasn't its to fix and pushed no commit, rather than genuinely attempting
|
|
142
|
+
a fix. Compares the live, per-tick-refreshed ``entry.branch_head_sha``
|
|
143
|
+
(see ``coord.merge_queue.process``'s freshness-anchor refresh, which
|
|
144
|
+
runs before a ``checks_failed`` event is ever emitted) against
|
|
145
|
+
``entry.ci_fix_head_sha``, the sha :func:`dispatch_ci_fix` snapshotted
|
|
146
|
+
at the moment of that dispatch.
|
|
147
|
+
|
|
148
|
+
Both empty (no ci-fix ever dispatched for this streak, or a probe
|
|
149
|
+
failure left the current SHA unknown) reads as ``False`` — fails
|
|
150
|
+
closed, same as every other SHA-staleness check in this codebase
|
|
151
|
+
(#821): "we can't tell" must never be treated as "we can tell it
|
|
152
|
+
didn't move".
|
|
153
|
+
"""
|
|
154
|
+
return (
|
|
155
|
+
bool(entry.ci_fix_head_sha)
|
|
156
|
+
and bool(entry.branch_head_sha)
|
|
157
|
+
and entry.ci_fix_head_sha == entry.branch_head_sha
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def refund_noop_ci_fix(entry: QueuedMerge) -> None:
|
|
162
|
+
"""Undo the attempt :func:`dispatch_ci_fix` speculatively spent for a
|
|
163
|
+
leg that turned out to be a no-op (:func:`dispatch_was_noop` is
|
|
164
|
+
``True``), and track the no-op streak separately so it cannot cycle
|
|
165
|
+
forever without ever reaching a verdict — see
|
|
166
|
+
:data:`MAX_CI_FIX_NOOP_STREAK`.
|
|
167
|
+
|
|
168
|
+
Called by ``coord.commands.merge._dispatch_ci_fixes`` BEFORE it decides
|
|
169
|
+
whether to dispatch again for this entry's event; the caller is
|
|
170
|
+
responsible for checking ``entry.ci_fix_noop_streak`` against the cap
|
|
171
|
+
afterwards and escalating/persisting as needed, same division of
|
|
172
|
+
responsibility as :func:`dispatch_ci_fix` itself.
|
|
173
|
+
"""
|
|
174
|
+
entry.ci_fix_dispatches = max(0, entry.ci_fix_dispatches - 1)
|
|
175
|
+
entry.ci_fix_noop_streak += 1
|
|
176
|
+
entry.ci_fix_head_sha = ""
|
|
177
|
+
|
|
178
|
+
|
|
126
179
|
def dispatch_ci_fix(
|
|
127
180
|
entry: QueuedMerge,
|
|
128
181
|
board: Board,
|
|
@@ -146,6 +199,14 @@ def dispatch_ci_fix(
|
|
|
146
199
|
only a successful dispatch spends the budget, mirroring how
|
|
147
200
|
``ci_infra_reruns``/``ci_flaky_reruns`` are only bumped when their
|
|
148
201
|
respective remedy actually fired.
|
|
202
|
+
|
|
203
|
+
#3011: a successful dispatch also snapshots ``entry.branch_head_sha``
|
|
204
|
+
into ``entry.ci_fix_head_sha`` so a later tick can tell whether this
|
|
205
|
+
leg actually moved the branch — see ``dispatch_was_noop``/
|
|
206
|
+
``refund_noop_ci_fix``. Callers are expected to check
|
|
207
|
+
``dispatch_was_noop(entry)`` and route through ``refund_noop_ci_fix``
|
|
208
|
+
BEFORE calling this function again for the same entry, so a worker
|
|
209
|
+
that pushed nothing doesn't silently spend a second real attempt.
|
|
149
210
|
"""
|
|
150
211
|
if entry.ci_fix_dispatches >= MAX_CI_FIX_DISPATCHES:
|
|
151
212
|
return None
|
|
@@ -181,6 +242,29 @@ def dispatch_ci_fix(
|
|
|
181
242
|
# purpose as conflict_fix's SEMANTIC_FIX_TITLE_PREFIX.
|
|
182
243
|
fix.issue_title = f"{CI_FIX_TITLE_PREFIX} {work.issue_title}"
|
|
183
244
|
|
|
245
|
+
# #3011: if a PRIOR dispatch's snapshot is still on the entry and the
|
|
246
|
+
# branch has since moved past it, that prior leg was a genuine attempt
|
|
247
|
+
# (not a no-op) — clear any no-op streak it may have left behind so it
|
|
248
|
+
# doesn't linger into this fresh attempt. (When the branch has NOT
|
|
249
|
+
# moved, the caller — `coord.commands.merge._dispatch_ci_fixes` — is
|
|
250
|
+
# expected to have already routed through `dispatch_was_noop`/
|
|
251
|
+
# `refund_noop_ci_fix` instead of reaching here; this is a harmless
|
|
252
|
+
# no-op in that case too, since `entry.ci_fix_noop_streak` would already
|
|
253
|
+
# be 0 for a caller that follows the intended sequencing.)
|
|
254
|
+
if (
|
|
255
|
+
entry.ci_fix_head_sha
|
|
256
|
+
and entry.branch_head_sha
|
|
257
|
+
and entry.ci_fix_head_sha != entry.branch_head_sha
|
|
258
|
+
):
|
|
259
|
+
entry.ci_fix_noop_streak = 0
|
|
260
|
+
|
|
261
|
+
# Snapshot the current branch HEAD so a later tick can tell whether
|
|
262
|
+
# THIS dispatch's leg actually moved the branch (see
|
|
263
|
+
# `dispatch_was_noop`). `branch_head_sha` may itself be None (a probe
|
|
264
|
+
# failure) — falls back to "" so an unknown SHA never spuriously reads
|
|
265
|
+
# as "no ci-fix dispatch pending" on the next comparison.
|
|
266
|
+
entry.ci_fix_head_sha = entry.branch_head_sha or ""
|
|
267
|
+
|
|
184
268
|
entry.ci_fix_dispatches += 1
|
|
185
269
|
|
|
186
270
|
from coord.audit import record_audit # noqa: PLC0415
|
|
@@ -835,6 +835,36 @@ def fetch_portal_link(
|
|
|
835
835
|
return link if isinstance(link, dict) else None
|
|
836
836
|
|
|
837
837
|
|
|
838
|
+
def fetch_portal_link_by_submission(
|
|
839
|
+
svc: ServiceConfig, submission_id: str, *, timeout: float = _DEFAULT_TIMEOUT
|
|
840
|
+
) -> dict | None:
|
|
841
|
+
"""GET the portal link for *submission_id* by reverse lookup (#2995) —
|
|
842
|
+
the submission-keyed counterpart to :func:`fetch_portal_link`'s
|
|
843
|
+
``(repo_name, milestone_number/issue_number)``-keyed one.
|
|
844
|
+
|
|
845
|
+
Backs :func:`coord.portal_store.get_link_by_submission` on a thin
|
|
846
|
+
client — needed once ``coord portal enqueue-status``'s #2996 "no link on
|
|
847
|
+
file" warning became reachable from one. Fail-soft to ``None`` on any
|
|
848
|
+
transport/HTTP/decode error, same reasoning as :func:`fetch_portal_link`:
|
|
849
|
+
a daemon hiccup degrades to the same "not linked" a genuinely unlinked
|
|
850
|
+
submission would show, rather than a traceback, for a read that only
|
|
851
|
+
ever gates a warning.
|
|
852
|
+
"""
|
|
853
|
+
try:
|
|
854
|
+
resp = httpx.get(
|
|
855
|
+
f"{svc.url}/portal-link-by-submission",
|
|
856
|
+
params={"submission_id": submission_id},
|
|
857
|
+
headers=_headers(svc),
|
|
858
|
+
timeout=timeout,
|
|
859
|
+
)
|
|
860
|
+
resp.raise_for_status()
|
|
861
|
+
data = resp.json()
|
|
862
|
+
except (httpx.HTTPError, ValueError):
|
|
863
|
+
return None
|
|
864
|
+
link = data.get("link") if isinstance(data, dict) else None
|
|
865
|
+
return link if isinstance(link, dict) else None
|
|
866
|
+
|
|
867
|
+
|
|
838
868
|
def fetch_portal_ledger(
|
|
839
869
|
svc: ServiceConfig, submission_id: str, *, timeout: float = _DEFAULT_TIMEOUT
|
|
840
870
|
) -> dict:
|
|
@@ -569,13 +569,43 @@ def _dispatch_ci_fixes(events, config, *, dry_run: bool) -> None:
|
|
|
569
569
|
is never reprocessed by a later ``process()`` call (it only acts on
|
|
570
570
|
``PENDING`` entries) so whichever caller sees the event first must also
|
|
571
571
|
be the one to act on it.
|
|
572
|
+
|
|
573
|
+
#3011: before dispatching again, checks whether the entry's LAST ci-fix
|
|
574
|
+
leg was a no-op — the branch HEAD is unchanged from
|
|
575
|
+
``entry.ci_fix_head_sha``, the snapshot ``dispatch_ci_fix`` took when it
|
|
576
|
+
dispatched that leg. A no-op means a fresh worker looked at this
|
|
577
|
+
failure and pushed no commit — evidence the failure isn't attributable
|
|
578
|
+
to this branch, not evidence a fix attempt failed — so it is refunded
|
|
579
|
+
(``coord.ci_fix.refund_noop_ci_fix``) rather than counted toward
|
|
580
|
+
``MAX_CI_FIX_DISPATCHES``. Consecutive no-ops are bounded separately by
|
|
581
|
+
``MAX_CI_FIX_NOOP_STREAK``, escalating to ``HUMAN_REQUIRED`` with a
|
|
582
|
+
distinct reason once THAT cap is hit — the goal being that a human is
|
|
583
|
+
called in because a worker genuinely tried and failed, or because the
|
|
584
|
+
failure is provably not this branch's, never because two correct
|
|
585
|
+
declines were miscounted as two failed attempts.
|
|
586
|
+
|
|
587
|
+
Before trusting ``dispatch_was_noop`` at all, first checks ``coord.
|
|
588
|
+
ci_fix._has_active_fix`` — the SHA comparison alone cannot distinguish
|
|
589
|
+
"the fix worker finished and declined to push" from "the fix worker is
|
|
590
|
+
still running and just hasn't pushed yet" (a dispatched leg stays
|
|
591
|
+
PENDING for its whole lifetime, so the very next tick after dispatch
|
|
592
|
+
would otherwise read as a noop). While a fix is still active, the entry
|
|
593
|
+
is left untouched — no refund, no streak bump, no new dispatch — for
|
|
594
|
+
the next tick to re-check.
|
|
572
595
|
"""
|
|
573
596
|
ci_events = [ev for ev in events if ev.kind == "checks_failed"]
|
|
574
597
|
if not ci_events or dry_run:
|
|
575
598
|
return
|
|
576
599
|
|
|
577
600
|
from coord.audit import record_audit # noqa: PLC0415
|
|
578
|
-
from coord.ci_fix import
|
|
601
|
+
from coord.ci_fix import ( # noqa: PLC0415
|
|
602
|
+
MAX_CI_FIX_DISPATCHES,
|
|
603
|
+
MAX_CI_FIX_NOOP_STREAK,
|
|
604
|
+
_has_active_fix,
|
|
605
|
+
dispatch_ci_fix,
|
|
606
|
+
dispatch_was_noop,
|
|
607
|
+
refund_noop_ci_fix,
|
|
608
|
+
)
|
|
579
609
|
from coord.merge_queue import HUMAN_REQUIRED # noqa: PLC0415
|
|
580
610
|
from coord.state import load_board, save_board # noqa: PLC0415
|
|
581
611
|
|
|
@@ -585,6 +615,83 @@ def _dispatch_ci_fixes(events, config, *, dry_run: bool) -> None:
|
|
|
585
615
|
dispatched_any = False
|
|
586
616
|
for ev in ci_events:
|
|
587
617
|
entry = ev.entry
|
|
618
|
+
# #3011 follow-up: `dispatch_was_noop` only compares the SHA
|
|
619
|
+
# snapshotted at dispatch time against the current branch head — it
|
|
620
|
+
# cannot tell "the fix worker finished and declined to push" apart
|
|
621
|
+
# from "the fix worker is still running and just hasn't pushed yet".
|
|
622
|
+
# A dispatched leg stays PENDING for its whole lifetime (`process()`
|
|
623
|
+
# never mutates entry.state for this path), so on the very next tick
|
|
624
|
+
# after dispatch the SHA still matches and `dispatch_was_noop` would
|
|
625
|
+
# read `True` for a leg that hasn't even had a chance to push.
|
|
626
|
+
# `_has_active_fix` is the same in-flight guard `dispatch_ci_fix`
|
|
627
|
+
# itself checks before dispatching — treat "still running" as "still
|
|
628
|
+
# pending" here too: skip the noop/refund accounting entirely and
|
|
629
|
+
# leave the entry untouched for the next tick, exactly like the
|
|
630
|
+
# generic "already in flight" decline below.
|
|
631
|
+
if _has_active_fix(fix_board, entry):
|
|
632
|
+
click.echo(
|
|
633
|
+
f" {entry.repo_name} #{entry.issue_number}: "
|
|
634
|
+
"ci-fix already in flight — will re-check next run"
|
|
635
|
+
)
|
|
636
|
+
continue
|
|
637
|
+
if dispatch_was_noop(entry):
|
|
638
|
+
refund_noop_ci_fix(entry)
|
|
639
|
+
dispatched_any = True
|
|
640
|
+
if entry.ci_fix_noop_streak >= MAX_CI_FIX_NOOP_STREAK:
|
|
641
|
+
entry.state = HUMAN_REQUIRED
|
|
642
|
+
click.echo(
|
|
643
|
+
f" {entry.repo_name} #{entry.issue_number}: "
|
|
644
|
+
f"{entry.ci_fix_noop_streak} consecutive ci-fix workers "
|
|
645
|
+
"pushed no commit — not attributable to this branch, "
|
|
646
|
+
"manual resolution required"
|
|
647
|
+
)
|
|
648
|
+
record_audit(
|
|
649
|
+
tier="operational",
|
|
650
|
+
category="merge",
|
|
651
|
+
event_type="ci_fix_not_attributable",
|
|
652
|
+
actor="daemon",
|
|
653
|
+
summary=(
|
|
654
|
+
f"ci-fix not attributable to branch: "
|
|
655
|
+
f"{entry.repo_name}#{entry.issue_number} — "
|
|
656
|
+
f"{entry.ci_fix_noop_streak} consecutive fix "
|
|
657
|
+
"workers pushed no commit; manual resolution "
|
|
658
|
+
"required"
|
|
659
|
+
),
|
|
660
|
+
repo=entry.repo_name,
|
|
661
|
+
issue=entry.issue_number,
|
|
662
|
+
assignment_id=entry.assignment_id,
|
|
663
|
+
details={
|
|
664
|
+
"reason": "ci_fix_noop_streak",
|
|
665
|
+
"ci_fix_noop_streak": entry.ci_fix_noop_streak,
|
|
666
|
+
"error": entry.error,
|
|
667
|
+
},
|
|
668
|
+
)
|
|
669
|
+
else:
|
|
670
|
+
click.echo(
|
|
671
|
+
f" {entry.repo_name} #{entry.issue_number}: "
|
|
672
|
+
"ci-fix leg pushed no commit — refunding attempt "
|
|
673
|
+
f"({entry.ci_fix_dispatches}/{MAX_CI_FIX_DISPATCHES} "
|
|
674
|
+
"real attempts spent), will retry next run"
|
|
675
|
+
)
|
|
676
|
+
record_audit(
|
|
677
|
+
tier="operational",
|
|
678
|
+
category="merge",
|
|
679
|
+
event_type="ci_fix_noop_refunded",
|
|
680
|
+
actor="daemon",
|
|
681
|
+
summary=(
|
|
682
|
+
f"ci-fix leg was a no-op (branch head unchanged): "
|
|
683
|
+
f"{entry.repo_name}#{entry.issue_number} — attempt "
|
|
684
|
+
"refunded, not counted toward the retry cap"
|
|
685
|
+
),
|
|
686
|
+
repo=entry.repo_name,
|
|
687
|
+
issue=entry.issue_number,
|
|
688
|
+
assignment_id=entry.assignment_id,
|
|
689
|
+
details={
|
|
690
|
+
"ci_fix_dispatches": entry.ci_fix_dispatches,
|
|
691
|
+
"ci_fix_noop_streak": entry.ci_fix_noop_streak,
|
|
692
|
+
},
|
|
693
|
+
)
|
|
694
|
+
continue
|
|
588
695
|
fix = dispatch_ci_fix(entry, fix_board, config, checks_summary=ev.message)
|
|
589
696
|
if fix is not None:
|
|
590
697
|
click.echo(
|
|
@@ -64,6 +64,23 @@ exactly like an inbound ``question.answered`` event does, flags it relayed
|
|
|
64
64
|
so it never reads as the client's own words, and folds the submission off
|
|
65
65
|
``needs-input``. Same daemon-routed shape (``POST /portal-note`` /
|
|
66
66
|
``POST /portal-answer``) and the same reason.
|
|
67
|
+
|
|
68
|
+
**``enqueue-question`` and ``enqueue-status`` are the last two, and the odd
|
|
69
|
+
ones out (#2995).** Every exception above routes unconditionally — any
|
|
70
|
+
machine in the fleet may be where the operator is typing. These two widen
|
|
71
|
+
the routed set instead of dropping the guard: ``coord portal decompose-chat
|
|
72
|
+
--interactive`` is dispatched only to a machine that claims the
|
|
73
|
+
submission's mapped repo(s) (#2750), and the Ask move — the one exit that
|
|
74
|
+
session could not take from a thin client, the gap this issue closes — is
|
|
75
|
+
exactly what these two commands queue. So they route through the daemon
|
|
76
|
+
(``POST /portal-enqueue-question`` / ``POST /portal-enqueue-status``) only
|
|
77
|
+
when :func:`_refuse_unless_claiming_machine` confirms the calling machine
|
|
78
|
+
claims every mapped repo; a non-claiming thin client still refuses, same as
|
|
79
|
+
every command at the top of this file. ``enqueue-question`` queues two rows
|
|
80
|
+
(the question and its ``needs-input`` announcement, #2901) — the daemon
|
|
81
|
+
applies both in the ONE request, so a partial application can never leave a
|
|
82
|
+
question with no status row behind it (the mute-question failure #2901
|
|
83
|
+
exists to prevent).
|
|
67
84
|
"""
|
|
68
85
|
|
|
69
86
|
from __future__ import annotations
|
|
@@ -98,10 +115,11 @@ def _actor() -> str:
|
|
|
98
115
|
def _refuse_if_thin_client(cmd_name: str) -> None:
|
|
99
116
|
"""Refuse *cmd_name* when this machine isn't the daemon host (#2336).
|
|
100
117
|
|
|
101
|
-
``sync``/``outbox``/``events``/``enqueue
|
|
102
|
-
the daemon's own
|
|
103
|
-
|
|
104
|
-
|
|
118
|
+
``sync``/``outbox``/``events``/``enqueue-design-round``/
|
|
119
|
+
``enqueue-preview``/``requeue`` read and write the daemon's own
|
|
120
|
+
``~/.coord/coord.db`` directly — there is no daemon proxy for portal
|
|
121
|
+
state yet (unlike ``coord status``/``coord log``/etc, which already
|
|
122
|
+
route through ``board_service`` when it's configured; see
|
|
105
123
|
``coord/client.py``'s module docstring for the bootstrap contract). Run
|
|
106
124
|
on a machine that has ``board_service`` set in ``~/.coord/client.toml``
|
|
107
125
|
(a thin client, by definition — every other machine in the fleet that
|
|
@@ -111,6 +129,10 @@ def _refuse_if_thin_client(cmd_name: str) -> None:
|
|
|
111
129
|
unnoticed on the daemon host for over an hour because every portal
|
|
112
130
|
command run from a thin client reported nothing pending).
|
|
113
131
|
|
|
132
|
+
``enqueue-question``/``enqueue-status`` used to be in that list too —
|
|
133
|
+
see :func:`_refuse_unless_claiming_machine` below (#2995) for why they
|
|
134
|
+
no longer call this at all.
|
|
135
|
+
|
|
114
136
|
Mirrors the guard already used for the same reason in
|
|
115
137
|
``coord.commands.drive_queue``'s ``diagnose`` command (#615/#906), which
|
|
116
138
|
refuses rather than "diagnose an empty queue" on a thin client. The
|
|
@@ -137,6 +159,101 @@ def _refuse_if_thin_client(cmd_name: str) -> None:
|
|
|
137
159
|
)
|
|
138
160
|
|
|
139
161
|
|
|
162
|
+
def _missing_claimed_repos(machine, repos: list[str]) -> list[str]:
|
|
163
|
+
"""Repos in REPOS that MACHINE does not claim — the "does this machine
|
|
164
|
+
claim every repo this submission maps to" predicate, in exactly one
|
|
165
|
+
place (#2995 review, #2085/#2096 "one question, one answer").
|
|
166
|
+
|
|
167
|
+
``machine is None`` (this box isn't a configured machine in
|
|
168
|
+
``coordinator.yml`` at all) counts every repo as unclaimed — an
|
|
169
|
+
unconfigured machine claims nothing. Shared by
|
|
170
|
+
:func:`_refuse_unless_claiming_machine` (above) and
|
|
171
|
+
``_run_decompose_chat_interactive`` (further down this module): both
|
|
172
|
+
ask this exact question before letting a thin/local client touch a
|
|
173
|
+
submission's mapped repo(s), and before this helper existed they asked
|
|
174
|
+
it with two independently-written comprehensions that happened to agree
|
|
175
|
+
only because they were written together in the same commit — nothing
|
|
176
|
+
kept them in sync if either changed later. Callers keep their own
|
|
177
|
+
branching for the ``machine is None`` case where they want a distinct
|
|
178
|
+
message/exit path (``_run_decompose_chat_interactive`` does); this only
|
|
179
|
+
answers "which repos are missing," never how to report it.
|
|
180
|
+
"""
|
|
181
|
+
if machine is None:
|
|
182
|
+
return list(repos)
|
|
183
|
+
return [r for r in repos if not machine.can_work_on(r)]
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _refuse_unless_claiming_machine(cfg, submission_id: str, cmd_name: str) -> None:
|
|
187
|
+
"""Refuse *cmd_name* on a thin client that does not claim every repo
|
|
188
|
+
SUBMISSION_ID maps to (#2995). A no-op on the daemon host itself.
|
|
189
|
+
|
|
190
|
+
``enqueue-question``/``enqueue-status`` are the Ask move's exit — the
|
|
191
|
+
one thing `coord portal decompose-chat --interactive` could not do from
|
|
192
|
+
a thin client that claims the submission's repo(s), even though that
|
|
193
|
+
session is explicitly allowed to run there (#2750). Unlike ``note``/
|
|
194
|
+
``decision``/``link``/``answer`` (#2751/#2867/#2986), which route
|
|
195
|
+
unconditionally — any machine in the fleet may be where the operator is
|
|
196
|
+
typing — this widens the refused set rather than dropping it: a
|
|
197
|
+
``type="decomposition-chat"`` session is never dispatched to a machine
|
|
198
|
+
that doesn't claim the submission's repo(s) in the first place
|
|
199
|
+
(:func:`coord.decomposition_chat.pick_decomposition_chat_machine`), so a
|
|
200
|
+
caller invoking these commands directly from one that *doesn't* claim
|
|
201
|
+
them is either a mistake or a machine that has no business writing
|
|
202
|
+
against this submission's outbox — that machine still refuses, exactly
|
|
203
|
+
like every other state-touching command in this file.
|
|
204
|
+
|
|
205
|
+
Repos are resolved the same thin-client-safe way
|
|
206
|
+
``_run_decompose_chat_interactive`` already does before ever launching a
|
|
207
|
+
session (see that function, further down in this module), and for the
|
|
208
|
+
identical reason:
|
|
209
|
+
:func:`coord.decomposition_chat.resolve_approved_submission`, itself
|
|
210
|
+
routed through the daemon's ``GET /board``. A submission that isn't
|
|
211
|
+
currently a recorded ``approved`` sign-off — the only shape that
|
|
212
|
+
projection carries — cannot be claim-checked from here at all, and this
|
|
213
|
+
refuses rather than guess at a repo list it cannot verify.
|
|
214
|
+
"""
|
|
215
|
+
from coord.board_service import resolve # noqa: PLC0415
|
|
216
|
+
|
|
217
|
+
svc = resolve()
|
|
218
|
+
if svc is None:
|
|
219
|
+
return
|
|
220
|
+
from urllib.parse import urlparse # noqa: PLC0415
|
|
221
|
+
|
|
222
|
+
from coord.decomposition_chat import resolve_approved_submission # noqa: PLC0415
|
|
223
|
+
from coord.test_orchestrator import local_machine # noqa: PLC0415
|
|
224
|
+
|
|
225
|
+
host = urlparse(svc.url).hostname or svc.url
|
|
226
|
+
submission = resolve_approved_submission(cfg, submission_id)
|
|
227
|
+
if submission is None:
|
|
228
|
+
raise click.ClickException(
|
|
229
|
+
f"coord portal {cmd_name} refuses: submission {submission_id!r} is "
|
|
230
|
+
"not a currently-approved portal submission, so its mapped "
|
|
231
|
+
"repo(s) cannot be resolved from this thin client to verify a "
|
|
232
|
+
"claim. Run it over `ssh` on the daemon host "
|
|
233
|
+
f"({host}) instead. See coord/skills/portal-followup/SKILL.md."
|
|
234
|
+
)
|
|
235
|
+
repos: list[str] = submission.get("repos") or []
|
|
236
|
+
machine = local_machine(cfg)
|
|
237
|
+
missing = _missing_claimed_repos(machine, repos)
|
|
238
|
+
if not repos or missing:
|
|
239
|
+
reason = (
|
|
240
|
+
f"submission {submission_id!r} has no mapped repo (portal."
|
|
241
|
+
"project_repos in coordinator.yml)"
|
|
242
|
+
if not repos
|
|
243
|
+
else (
|
|
244
|
+
f"this machine ({machine.name if machine is not None else 'unconfigured'}) "
|
|
245
|
+
f"does not claim repo(s) {', '.join(missing)} that submission "
|
|
246
|
+
f"{submission_id!r} maps to ({', '.join(repos)})"
|
|
247
|
+
)
|
|
248
|
+
)
|
|
249
|
+
raise click.ClickException(
|
|
250
|
+
f"coord portal {cmd_name} refuses: {reason}. Run it over `ssh` on "
|
|
251
|
+
f"the daemon host ({host}) instead, or from a machine that claims "
|
|
252
|
+
"every repo the submission maps to. See "
|
|
253
|
+
"coord/skills/portal-followup/SKILL.md."
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
|
|
140
257
|
@click.group("portal")
|
|
141
258
|
def portal_group() -> None:
|
|
142
259
|
"""coord-portal sync bridge — status, manual push, heartbeat (#2179)."""
|
|
@@ -439,11 +556,11 @@ def portal_link(
|
|
|
439
556
|
"headless dispatch. Local-only for now (Track B / #486 is remote): "
|
|
440
557
|
"refuses when this machine does not claim every repo SUBMISSION_ID "
|
|
441
558
|
"maps to. On a thin client (this machine has `board_service` "
|
|
442
|
-
"configured), `coord portal decision`/`ledger`/`link
|
|
443
|
-
"
|
|
444
|
-
"
|
|
445
|
-
"
|
|
446
|
-
"
|
|
559
|
+
"configured), `coord portal decision`/`ledger`/`link`/`note`/"
|
|
560
|
+
"`answer` and (#2995) `enqueue-question`/`enqueue-status` — "
|
|
561
|
+
"including the Ask move — all route through the daemon, so every "
|
|
562
|
+
"exit an iteration can take works from here. Mutually exclusive "
|
|
563
|
+
"with --wait/--machine/--timeout/--interval."
|
|
447
564
|
),
|
|
448
565
|
)
|
|
449
566
|
@click.option(
|
|
@@ -657,7 +774,7 @@ def _run_decompose_chat_interactive(
|
|
|
657
774
|
err=True,
|
|
658
775
|
)
|
|
659
776
|
raise SystemExit(2)
|
|
660
|
-
missing =
|
|
777
|
+
missing = _missing_claimed_repos(machine, repos)
|
|
661
778
|
if missing:
|
|
662
779
|
click.echo(
|
|
663
780
|
f"error: --interactive is local-only for now (Track B / #486 is "
|
|
@@ -669,19 +786,12 @@ def _run_decompose_chat_interactive(
|
|
|
669
786
|
)
|
|
670
787
|
raise SystemExit(2)
|
|
671
788
|
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
"but `coord "
|
|
679
|
-
"portal enqueue-question`/`enqueue-status` (the Ask move) do "
|
|
680
|
-
"not yet and will refuse loudly if this iteration needs them. "
|
|
681
|
-
"ssh to the daemon host for that case (#2750's own stated "
|
|
682
|
-
"limit).",
|
|
683
|
-
fg="yellow",
|
|
684
|
-
)
|
|
789
|
+
# #2995: no thin-client caveat left to print here — `decision`/`ledger`/
|
|
790
|
+
# `link`/`note`/`answer` (#2751/#2867/#2986) and now `enqueue-question`/
|
|
791
|
+
# `enqueue-status` (the Ask move's exit) all route through the daemon
|
|
792
|
+
# from exactly this machine, which the claim check above just verified
|
|
793
|
+
# claims every repo SUBMISSION_ID maps to. A prior revision warned here
|
|
794
|
+
# that the Ask move would "refuse loudly" — no longer true.
|
|
685
795
|
|
|
686
796
|
topology_context = repo_topology_context(cfg, repos)
|
|
687
797
|
discuss_mode, discuss_reason = select_discuss_mode(cfg, submission, discuss_override=discuss)
|
|
@@ -1335,9 +1445,10 @@ def _echo_enqueued(row: "OutboxRow", label: str) -> None:
|
|
|
1335
1445
|
|
|
1336
1446
|
|
|
1337
1447
|
@portal_group.command("enqueue-status")
|
|
1448
|
+
@_CONFIG_OPTION
|
|
1338
1449
|
@click.argument("submission_id")
|
|
1339
1450
|
@click.argument("status", type=click.Choice(SUBMISSION_STATUSES))
|
|
1340
|
-
def portal_enqueue_status(submission_id: str, status: str) -> None:
|
|
1451
|
+
def portal_enqueue_status(config_path, submission_id: str, status: str) -> None:
|
|
1341
1452
|
"""Queue an up-mapped status for SUBMISSION_ID (sent on the next sync).
|
|
1342
1453
|
|
|
1343
1454
|
Unlike `push`, this allocates the revision for you and refuses a status
|
|
@@ -1359,8 +1470,15 @@ def portal_enqueue_status(submission_id: str, status: str) -> None:
|
|
|
1359
1470
|
sends the push regardless — there are legitimate reasons to set any of
|
|
1360
1471
|
these by hand (a correction, a re-sync, an out-of-band delivery) — it
|
|
1361
1472
|
only makes the consequence visible first.
|
|
1473
|
+
|
|
1474
|
+
**#2995: routes through the daemon on a thin client that claims
|
|
1475
|
+
SUBMISSION_ID's mapped repo(s)**, instead of refusing outright like
|
|
1476
|
+
every other state-touching ``enqueue-*`` command — see
|
|
1477
|
+
:func:`_refuse_unless_claiming_machine`. This is the ``enqueue-status``
|
|
1478
|
+
half of the Ask move's exit; ``enqueue-question`` below is the other.
|
|
1362
1479
|
"""
|
|
1363
|
-
|
|
1480
|
+
cfg = _load_config(config_path)
|
|
1481
|
+
_refuse_unless_claiming_machine(cfg, submission_id, "enqueue-status")
|
|
1364
1482
|
|
|
1365
1483
|
from coord.approved_work import is_pulled_status # noqa: PLC0415
|
|
1366
1484
|
from coord.portal_sync import PortalSyncError, enqueue_status # noqa: PLC0415
|
|
@@ -1385,9 +1503,19 @@ def portal_enqueue_status(submission_id: str, status: str) -> None:
|
|
|
1385
1503
|
fg="yellow",
|
|
1386
1504
|
)
|
|
1387
1505
|
|
|
1506
|
+
import httpx # noqa: PLC0415
|
|
1507
|
+
|
|
1388
1508
|
try:
|
|
1389
|
-
row = enqueue_status(submission_id, status)
|
|
1390
|
-
except PortalSyncError as exc:
|
|
1509
|
+
row = enqueue_status(submission_id, status, config=cfg)
|
|
1510
|
+
except (PortalSyncError, httpx.HTTPStatusError) as exc:
|
|
1511
|
+
# #2995 fix-round: routed through the daemon (see
|
|
1512
|
+
# `_refuse_unless_claiming_machine` above), a rejection comes back
|
|
1513
|
+
# as `httpx.HTTPStatusError` (`board_service.route_write` →
|
|
1514
|
+
# `client.post_record`), not `PortalSyncError` — the daemon-host
|
|
1515
|
+
# path's identical rejection (e.g. an announcing status with
|
|
1516
|
+
# nothing queued) never reaches `post_record` at all. Without this,
|
|
1517
|
+
# a thin-client caller saw a raw traceback where a daemon-host
|
|
1518
|
+
# caller got this same clean red message.
|
|
1391
1519
|
click.secho(str(exc), fg="red")
|
|
1392
1520
|
raise SystemExit(1) from exc
|
|
1393
1521
|
_echo_enqueued(row, f"status={status}")
|
|
@@ -1444,23 +1572,38 @@ def portal_enqueue_preview(submission_id: str, preview_url: str) -> None:
|
|
|
1444
1572
|
|
|
1445
1573
|
|
|
1446
1574
|
@portal_group.command("enqueue-question")
|
|
1575
|
+
@_CONFIG_OPTION
|
|
1447
1576
|
@click.argument("submission_id")
|
|
1448
1577
|
@click.argument("question")
|
|
1449
|
-
def portal_enqueue_question(submission_id: str, question: str) -> None:
|
|
1578
|
+
def portal_enqueue_question(config_path, submission_id: str, question: str) -> None:
|
|
1450
1579
|
"""Queue an open question for SUBMISSION_ID (sent on the next sync).
|
|
1451
1580
|
|
|
1452
1581
|
Also queues the `needs-input` status that announces it (#2901) — a
|
|
1453
1582
|
question with no status row behind it sends no email, so this command
|
|
1454
1583
|
always queues both rows in one call rather than leaving the second one
|
|
1455
|
-
to a caller who might forget it.
|
|
1584
|
+
to a caller who might forget it. When routed through the daemon (see
|
|
1585
|
+
below), both rows are applied in that one request, so a crash or a
|
|
1586
|
+
dropped response can never leave the question queued without its
|
|
1587
|
+
announcement.
|
|
1588
|
+
|
|
1589
|
+
**#2995: routes through the daemon on a thin client that claims
|
|
1590
|
+
SUBMISSION_ID's mapped repo(s)**, instead of refusing outright — see
|
|
1591
|
+
:func:`_refuse_unless_claiming_machine`. This is the Ask move's other
|
|
1592
|
+
half; ``enqueue-status`` above is the one a plain status push uses.
|
|
1456
1593
|
"""
|
|
1457
|
-
|
|
1594
|
+
cfg = _load_config(config_path)
|
|
1595
|
+
_refuse_unless_claiming_machine(cfg, submission_id, "enqueue-question")
|
|
1458
1596
|
|
|
1459
1597
|
from coord.portal_sync import PortalSyncError, enqueue_question # noqa: PLC0415
|
|
1460
1598
|
|
|
1599
|
+
import httpx # noqa: PLC0415
|
|
1600
|
+
|
|
1461
1601
|
try:
|
|
1462
|
-
question_row, status_row = enqueue_question(submission_id, question)
|
|
1463
|
-
except PortalSyncError as exc:
|
|
1602
|
+
question_row, status_row = enqueue_question(submission_id, question, config=cfg)
|
|
1603
|
+
except (PortalSyncError, httpx.HTTPStatusError) as exc:
|
|
1604
|
+
# #2995 fix-round: see the matching comment in `portal_enqueue_status`
|
|
1605
|
+
# above — a routed rejection surfaces as `httpx.HTTPStatusError`, not
|
|
1606
|
+
# `PortalSyncError`.
|
|
1464
1607
|
click.secho(str(exc), fg="red")
|
|
1465
1608
|
raise SystemExit(1) from exc
|
|
1466
1609
|
_echo_enqueued(question_row, "question")
|