code-coordinator 0.5.186__tar.gz → 0.5.188__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.186 → code_coordinator-0.5.188}/PKG-INFO +1 -1
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/cli.py +2 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/merge.py +82 -1
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/conflict_fix.py +55 -6
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/merge_queue.py +12 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notify.py +152 -14
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/state.py +81 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_merge.py +116 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_conflict_fix.py +94 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notify.py +171 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_state.py +97 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.gitignore +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/CLAUDE.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/GOAL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/LICENSE +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/MANIFEST.in +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/README.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/__init__.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agent.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/audit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/block_log.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/board_service.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/brain.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/claim.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/client.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/comments.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/config.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dao.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/db.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deps.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/drive.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/events.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/filelock.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/freshness.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/gates.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/goal.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/context.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/models.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/render.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/units.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/hooks.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/interactive.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/models.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/network.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/openapi.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/parentage.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/plans.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/progress.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/release_window.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/reports.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/review.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/self_health.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/smoke.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/split_work.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/test_author.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/test_report.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/usage.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/install-agent.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/pyproject.toml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/setup.cfg +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/__init__.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/conftest.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_db.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_events.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_init.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_models.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_network.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_session.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_split.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -91,6 +91,7 @@ from coord.notifier.cli import notifier_group
|
|
|
91
91
|
# client, coord/commands/portal.py is the CLI over it.
|
|
92
92
|
from coord.commands.portal import portal_group
|
|
93
93
|
from coord.commands.merge import (
|
|
94
|
+
backfill_review_cost,
|
|
94
95
|
bounce,
|
|
95
96
|
merge,
|
|
96
97
|
post_pending_reviews,
|
|
@@ -442,6 +443,7 @@ main.add_command(unqueue)
|
|
|
442
443
|
main.add_command(set_test_mode)
|
|
443
444
|
main.add_command(notify)
|
|
444
445
|
main.add_command(post_pending_reviews)
|
|
446
|
+
main.add_command(backfill_review_cost)
|
|
445
447
|
main.add_command(merge)
|
|
446
448
|
main.add_command(resume)
|
|
447
449
|
main.add_command(test)
|
|
@@ -456,7 +456,9 @@ def _dispatch_conflict_fixes(events, config, *, dry_run: bool) -> None:
|
|
|
456
456
|
# failed for this entry in this session, don't loop — mark
|
|
457
457
|
# HUMAN_REQUIRED so the user takes over. A successful
|
|
458
458
|
# prior fix does not trigger this guard (#784).
|
|
459
|
-
if has_prior_conflict_fix(
|
|
459
|
+
if has_prior_conflict_fix(
|
|
460
|
+
fix_board, ev.entry.assignment_id, current_error=ev.entry.error,
|
|
461
|
+
):
|
|
460
462
|
ev.entry.state = HUMAN_REQUIRED
|
|
461
463
|
click.echo(
|
|
462
464
|
f" {ev.entry.repo_name} #{ev.entry.issue_number}: "
|
|
@@ -881,6 +883,85 @@ def post_pending_reviews(config_path: Path, repo_name: str | None) -> None:
|
|
|
881
883
|
)
|
|
882
884
|
|
|
883
885
|
|
|
886
|
+
@click.command(
|
|
887
|
+
"backfill-review-cost",
|
|
888
|
+
help=(
|
|
889
|
+
"One-shot repair for #2476: capture cost/tokens for review "
|
|
890
|
+
"assignments left at cost_usd IS NULL/0 by the review-completion "
|
|
891
|
+
"capture gap (post_orphaned_review_findings recovered the verdict "
|
|
892
|
+
"but never captured cost/tokens — fixed going forward, this repairs "
|
|
893
|
+
"the backlog it already created).\n\n"
|
|
894
|
+
"Walks every terminal type='review' row with cost_usd IS NULL or 0, "
|
|
895
|
+
"tries the local log first, then the assignment's agent /logs/<id> "
|
|
896
|
+
"endpoint, parses, and persists via the same "
|
|
897
|
+
"update_assignment_cost/update_assignment_tokens writers the live "
|
|
898
|
+
"capture path uses — no new write mechanism. Run once per machine "
|
|
899
|
+
"that hosts review logs; logs that have already aged out (or "
|
|
900
|
+
"whose agent is offline) are reported as still-missing rather than "
|
|
901
|
+
"silently dropped, so the residual gap stays known."
|
|
902
|
+
),
|
|
903
|
+
)
|
|
904
|
+
@_CONFIG_OPTION
|
|
905
|
+
@click.option("--repo", "repo_name", default=None, help="Only process assignments for this repo.")
|
|
906
|
+
def backfill_review_cost(config_path: Path, repo_name: str | None) -> None:
|
|
907
|
+
from coord.notify import _capture_cost_and_tokens_for_review
|
|
908
|
+
from coord.state import load_review_assignments_missing_cost
|
|
909
|
+
from coord.usage import LOGS_DIR
|
|
910
|
+
|
|
911
|
+
cfg = _load_config(config_path)
|
|
912
|
+
machines_by_name = {m.name: m for m in cfg.machines}
|
|
913
|
+
|
|
914
|
+
candidates = load_review_assignments_missing_cost(repo_name=repo_name)
|
|
915
|
+
if not candidates:
|
|
916
|
+
click.echo("No review assignments with missing cost/tokens found.")
|
|
917
|
+
return
|
|
918
|
+
|
|
919
|
+
click.echo(f"Found {len(candidates)} review assignment(s) with missing cost/tokens:")
|
|
920
|
+
for row in candidates:
|
|
921
|
+
click.echo(
|
|
922
|
+
f" {row['assignment_id']} — {row['repo_name']} #{row['issue_number']} "
|
|
923
|
+
f"(machine: {row['machine_name']})"
|
|
924
|
+
)
|
|
925
|
+
|
|
926
|
+
recovered: list[dict] = []
|
|
927
|
+
still_missing: list[dict] = []
|
|
928
|
+
for row in candidates:
|
|
929
|
+
aid = row["assignment_id"]
|
|
930
|
+
machine = machines_by_name.get(row["machine_name"])
|
|
931
|
+
host = machine.host if machine is not None else None
|
|
932
|
+
# #2476: always offer the conventional local path — it resolves
|
|
933
|
+
# correctly whenever this command runs on the same box that hosted
|
|
934
|
+
# the review (the common case for a per-machine repair run), and is
|
|
935
|
+
# a harmless miss otherwise (falls straight through to the *host*
|
|
936
|
+
# fetch below, same as `_capture_cost_and_tokens_for_review` already
|
|
937
|
+
# does for every other caller).
|
|
938
|
+
log_path = str(LOGS_DIR / f"{aid}.log")
|
|
939
|
+
wrote = _capture_cost_and_tokens_for_review(
|
|
940
|
+
aid, log_path=log_path, host=host,
|
|
941
|
+
provider_name=row.get("provider_name"),
|
|
942
|
+
)
|
|
943
|
+
(recovered if wrote else still_missing).append(row)
|
|
944
|
+
|
|
945
|
+
click.echo(f"\nRecovered cost/tokens for {len(recovered)} assignment(s):")
|
|
946
|
+
for row in recovered:
|
|
947
|
+
click.echo(f" {row['assignment_id']} — {row['repo_name']} #{row['issue_number']}")
|
|
948
|
+
|
|
949
|
+
if still_missing:
|
|
950
|
+
click.echo(
|
|
951
|
+
f"\n{len(still_missing)} assignment(s) still missing "
|
|
952
|
+
"(log gone on disk and agent unreachable/offline):"
|
|
953
|
+
)
|
|
954
|
+
for row in still_missing:
|
|
955
|
+
click.echo(
|
|
956
|
+
f" {row['assignment_id']} — {row['repo_name']} #{row['issue_number']} "
|
|
957
|
+
f"(machine: {row['machine_name']})"
|
|
958
|
+
)
|
|
959
|
+
click.echo(
|
|
960
|
+
f"\nSummary: {len(recovered)} recovered, {len(still_missing)} still missing "
|
|
961
|
+
f"of {len(candidates)} total."
|
|
962
|
+
)
|
|
963
|
+
|
|
964
|
+
|
|
884
965
|
def _load_issue_states() -> tuple[dict[str, set[int]], dict[str, set[int]]]:
|
|
885
966
|
"""Return ``(open_by_repo, known_by_repo)``.
|
|
886
967
|
|
|
@@ -367,7 +367,32 @@ def _has_active_conflict_fix(board: Board, merge_entry_id: str | None) -> bool:
|
|
|
367
367
|
)
|
|
368
368
|
|
|
369
369
|
|
|
370
|
-
def
|
|
370
|
+
def _dispatched_error(assignment: Assignment) -> str | None:
|
|
371
|
+
"""The merge-failure text *assignment*'s briefing was built from.
|
|
372
|
+
|
|
373
|
+
``build_conflict_fix_briefing``/``build_semantic_conflict_briefing``
|
|
374
|
+
both embed the triggering ``QueuedMerge.error`` verbatim (as a
|
|
375
|
+
``"Reason: …"``/``"Last merge error: …"`` line) — that's the only durable
|
|
376
|
+
record of what the merge looked like *at dispatch time*, since
|
|
377
|
+
``on_conflict_fix_done`` clears ``entry.error`` back to ``None`` on
|
|
378
|
+
success before the merge is retried. Returns ``None`` when the briefing
|
|
379
|
+
doesn't carry either marker (e.g. a hand-built test ``Assignment``).
|
|
380
|
+
"""
|
|
381
|
+
briefing = assignment.briefing or ""
|
|
382
|
+
for line in briefing.splitlines():
|
|
383
|
+
if line.startswith("Reason: "):
|
|
384
|
+
return line[len("Reason: "):]
|
|
385
|
+
if line.startswith("Last merge error: "):
|
|
386
|
+
return line[len("Last merge error: "):]
|
|
387
|
+
return None
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def has_prior_conflict_fix(
|
|
391
|
+
board: Board,
|
|
392
|
+
merge_entry_id: str | None,
|
|
393
|
+
*,
|
|
394
|
+
current_error: str | None = None,
|
|
395
|
+
) -> bool:
|
|
371
396
|
"""True when a second conflict-fix dispatch for *merge_entry_id* is blocked.
|
|
372
397
|
|
|
373
398
|
Blocks when a conflict-fix is **active** (running/pending — don't spawn a
|
|
@@ -379,6 +404,18 @@ def has_prior_conflict_fix(board: Board, merge_entry_id: str | None) -> bool:
|
|
|
379
404
|
followed by a new conflict if other PRs merged in the meantime; that is a
|
|
380
405
|
fresh situation and warrants a fresh fix attempt. Only actual failures
|
|
381
406
|
consume the one-per-entry cap.
|
|
407
|
+
|
|
408
|
+
#2475: that "successful" carve-out assumed a ``done`` conflict-fix always
|
|
409
|
+
resolved *something*. It doesn't when the merge was never blocked by a
|
|
410
|
+
content conflict in the first place (e.g. a permanently-unmergeable
|
|
411
|
+
branch-protection state) — the worker finds nothing to rebase, exits
|
|
412
|
+
``done``, and the merge queue retries into the *identical* failure
|
|
413
|
+
forever (#2009's 38-turn thrash). When *current_error* is given and a
|
|
414
|
+
prior ``done`` conflict-fix's dispatch-time error
|
|
415
|
+
(:func:`_dispatched_error`) matches it exactly, that's the same blocker
|
|
416
|
+
recurring unchanged — not a fresh conflict — so it now consumes the cap
|
|
417
|
+
too. Callers that don't pass *current_error* keep the pre-#2475 behaviour
|
|
418
|
+
(``done`` never blocks) since they have no error text to compare.
|
|
382
419
|
"""
|
|
383
420
|
if merge_entry_id is None:
|
|
384
421
|
return False
|
|
@@ -393,9 +430,16 @@ def has_prior_conflict_fix(board: Board, merge_entry_id: str | None) -> bool:
|
|
|
393
430
|
# Genuine failure — retry cap consumed, surface to human.
|
|
394
431
|
if a.status in ("failed", "advisory"):
|
|
395
432
|
return True
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
433
|
+
if a.status == "done":
|
|
434
|
+
if current_error is not None and _dispatched_error(a) == current_error:
|
|
435
|
+
# Same failure text recurring after a "successful" fix means
|
|
436
|
+
# nothing was actually fixed — treat like a genuine failure.
|
|
437
|
+
return True
|
|
438
|
+
# Otherwise: successful rebase, different (or unknown) situation
|
|
439
|
+
# now → cap not consumed; a re-conflict is new.
|
|
440
|
+
# "cancelled" falls through here too — a cancelled attempt did no
|
|
441
|
+
# work, so it is treated the same as an unrelated "done": re-dispatch
|
|
442
|
+
# is allowed.
|
|
399
443
|
return False
|
|
400
444
|
|
|
401
445
|
|
|
@@ -463,7 +507,10 @@ def dispatch_conflict_fix(
|
|
|
463
507
|
the caller marks the entry ``HUMAN_REQUIRED``. A ``done`` (successful)
|
|
464
508
|
conflict-fix does *not* block a new dispatch — a successful rebase can be
|
|
465
509
|
followed by a fresh conflict if other PRs merged in the meantime, and that
|
|
466
|
-
warrants a new attempt rather than an immediate human escalation (#784)
|
|
510
|
+
warrants a new attempt rather than an immediate human escalation (#784) —
|
|
511
|
+
UNLESS (#2475) *entry.error* is identical to the error the prior ``done``
|
|
512
|
+
attempt was dispatched for, which means the merge failed the same way
|
|
513
|
+
again with nothing actually fixed; see :func:`has_prior_conflict_fix`.
|
|
467
514
|
|
|
468
515
|
``semantic=True`` (#1291) dispatches the escalated second attempt: a
|
|
469
516
|
different, less prescriptive briefing (see
|
|
@@ -481,7 +528,9 @@ def dispatch_conflict_fix(
|
|
|
481
528
|
return None
|
|
482
529
|
if _has_active_conflict_fix(board, entry.assignment_id):
|
|
483
530
|
return None
|
|
484
|
-
elif has_prior_conflict_fix(
|
|
531
|
+
elif has_prior_conflict_fix(
|
|
532
|
+
board, entry.assignment_id, current_error=entry.error,
|
|
533
|
+
):
|
|
485
534
|
return None
|
|
486
535
|
|
|
487
536
|
repo = config.repo(entry.repo_name)
|
|
@@ -93,6 +93,18 @@ _HUMAN_SIGNALS = (
|
|
|
93
93
|
"permission",
|
|
94
94
|
"protected branch",
|
|
95
95
|
"branch protection",
|
|
96
|
+
# #2475: GitHub's wording when a required status check can never report
|
|
97
|
+
# — e.g. its source CI job was deleted from the workflow while the
|
|
98
|
+
# check was still required in branch protection. This is a *permanent*
|
|
99
|
+
# block; no rebase or content change fixes it. The full message is
|
|
100
|
+
# something like "Pull request X is not mergeable: the base branch
|
|
101
|
+
# policy prohibits the merge.", which also contains "not mergeable" —
|
|
102
|
+
# a _REBASEABLE_SIGNALS entry — so without this specific phrase here,
|
|
103
|
+
# classify_conflict fell through past _HUMAN_SIGNALS (no match) to
|
|
104
|
+
# _REBASEABLE_SIGNALS's generic "not mergeable" match and misclassified
|
|
105
|
+
# the failure as "rebaseable", dispatching a conflict-fix worker that
|
|
106
|
+
# could never succeed (#2009's 38-turn thrash).
|
|
107
|
+
"policy prohibits the merge",
|
|
96
108
|
)
|
|
97
109
|
|
|
98
110
|
|
|
@@ -884,7 +884,11 @@ def detect_stalled_pipeline(
|
|
|
884
884
|
elif (
|
|
885
885
|
matching_entry.state == CONFLICT
|
|
886
886
|
and classify_conflict(matching_entry.error) == "rebaseable"
|
|
887
|
-
and not has_prior_conflict_fix(
|
|
887
|
+
and not has_prior_conflict_fix(
|
|
888
|
+
board,
|
|
889
|
+
matching_entry.assignment_id,
|
|
890
|
+
current_error=matching_entry.error,
|
|
891
|
+
)
|
|
888
892
|
):
|
|
889
893
|
# #1478: a rebaseable CONFLICT with no active/failed
|
|
890
894
|
# conflict-fix attempt — the #1474 classify-and-dispatch step
|
|
@@ -1412,7 +1416,9 @@ def dispatch_stalled_pipeline_action(
|
|
|
1412
1416
|
return StalledDispatchAction(
|
|
1413
1417
|
kind="no_action", detail="merge queue entry no longer found",
|
|
1414
1418
|
)
|
|
1415
|
-
if has_prior_conflict_fix(
|
|
1419
|
+
if has_prior_conflict_fix(
|
|
1420
|
+
board, entry.assignment_id, current_error=entry.error,
|
|
1421
|
+
):
|
|
1416
1422
|
return StalledDispatchAction(
|
|
1417
1423
|
kind="skipped_human_required",
|
|
1418
1424
|
detail="conflict-fix already active or its retry cap was already hit",
|
|
@@ -2127,28 +2133,26 @@ def _persist_review_findings(assignment_id: str, verdict: str, body: str) -> Non
|
|
|
2127
2133
|
)
|
|
2128
2134
|
|
|
2129
2135
|
|
|
2130
|
-
def
|
|
2131
|
-
|
|
2136
|
+
def _fetch_raw_log_text_by_id(
|
|
2137
|
+
assignment_id: str, log_path: str | None, host: str | None,
|
|
2138
|
+
) -> str | None:
|
|
2139
|
+
"""Shared local-file-then-agent-fetch raw-text primitive.
|
|
2132
2140
|
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
``None`` on any I/O failure — diagnostics are best-effort by design and
|
|
2139
|
-
must never be the reason ``coord notify`` raises.
|
|
2141
|
+
Tries *log_path* on the local filesystem first (cheap, no network); when
|
|
2142
|
+
that's absent or unreadable (the worker ran on a remote agent whose log
|
|
2143
|
+
isn't on this filesystem), falls back to fetching it via the agent's
|
|
2144
|
+
``/logs/<id>`` endpoint at *host*. Returns ``None`` when neither source
|
|
2145
|
+
yields text — every caller here is best-effort by design.
|
|
2140
2146
|
"""
|
|
2141
|
-
log_path = entry.get("log_path")
|
|
2142
2147
|
if log_path:
|
|
2143
2148
|
try:
|
|
2144
2149
|
return Path(log_path).read_text(encoding="utf-8", errors="replace")
|
|
2145
2150
|
except OSError:
|
|
2146
2151
|
pass
|
|
2147
|
-
host = _agent_host(transition.machine_name)
|
|
2148
2152
|
if host:
|
|
2149
2153
|
try:
|
|
2150
2154
|
resp = httpx.get(
|
|
2151
|
-
f"http://{host}:{AGENT_PORT}/logs/{
|
|
2155
|
+
f"http://{host}:{AGENT_PORT}/logs/{assignment_id}",
|
|
2152
2156
|
timeout=15.0,
|
|
2153
2157
|
)
|
|
2154
2158
|
resp.raise_for_status()
|
|
@@ -2158,6 +2162,126 @@ def _fetch_raw_log_text(transition: Transition, entry: dict) -> str | None:
|
|
|
2158
2162
|
return None
|
|
2159
2163
|
|
|
2160
2164
|
|
|
2165
|
+
def _fetch_raw_log_text(transition: Transition, entry: dict) -> str | None:
|
|
2166
|
+
"""Best-effort raw log text for #1956/#1348 diagnostics.
|
|
2167
|
+
|
|
2168
|
+
Mirrors the local-file-then-agent-fetch fallback :func:`_try_parse_and_post_review`
|
|
2169
|
+
itself uses to PARSE the log, but returns the raw text instead — the
|
|
2170
|
+
diagnostic detectors (:func:`coord.review.detect_end_review_without_verdict`,
|
|
2171
|
+
:func:`coord.review.detect_unparsed_review_marker`) need the text the
|
|
2172
|
+
strict parser already rejected, not another parse attempt. Returns
|
|
2173
|
+
``None`` on any I/O failure — diagnostics are best-effort by design and
|
|
2174
|
+
must never be the reason ``coord notify`` raises.
|
|
2175
|
+
"""
|
|
2176
|
+
log_path = entry.get("log_path")
|
|
2177
|
+
host = _agent_host(transition.machine_name)
|
|
2178
|
+
return _fetch_raw_log_text_by_id(transition.assignment_id, log_path, host)
|
|
2179
|
+
|
|
2180
|
+
|
|
2181
|
+
def _capture_cost_and_tokens_for_review(
|
|
2182
|
+
assignment_id: str,
|
|
2183
|
+
*,
|
|
2184
|
+
log_path: str | None,
|
|
2185
|
+
host: str | None,
|
|
2186
|
+
provider_name: str | None = None,
|
|
2187
|
+
) -> bool:
|
|
2188
|
+
"""#2476: best-effort cost/token capture for a review row, local-log-
|
|
2189
|
+
first with a remote-agent-fetch fallback.
|
|
2190
|
+
|
|
2191
|
+
``post_transition``'s ``_capture_cost`` is the ONLY place cost/tokens get
|
|
2192
|
+
captured for a review that completes through the direct
|
|
2193
|
+
``detect_transitions`` path — but investigation of #2476 found the
|
|
2194
|
+
majority of review completions actually get their GitHub comment posted
|
|
2195
|
+
later, by :func:`post_orphaned_review_findings` (run_drain's step 4,
|
|
2196
|
+
which runs on every ~60s drain tick, not just as manual cleanup): that
|
|
2197
|
+
function does its own independent ``/status`` poll and local-then-remote
|
|
2198
|
+
log fallback to recover the VERDICT, but until now never captured
|
|
2199
|
+
cost/tokens at all. Once that row is marked ``notified``/
|
|
2200
|
+
``review_posted_at``, nothing ever revisits it — so a review rescued by
|
|
2201
|
+
the orphaned-findings path was permanently stuck at ``cost_usd IS NULL``
|
|
2202
|
+
even though the exact same log :func:`post_orphaned_review_findings`
|
|
2203
|
+
just successfully parsed the verdict from also has a perfectly good
|
|
2204
|
+
``total_cost_usd`` in it.
|
|
2205
|
+
|
|
2206
|
+
Mirrors :func:`_capture_cost`'s log-parse-then-persist logic (same
|
|
2207
|
+
:func:`coord.usage.parse_usage_from_log`, same
|
|
2208
|
+
``update_assignment_cost``/``update_assignment_tokens`` writers) so this
|
|
2209
|
+
is not a new capture mechanism — just the existing one, reachable from a
|
|
2210
|
+
second call site. Never raises; returns True iff something was
|
|
2211
|
+
persisted.
|
|
2212
|
+
"""
|
|
2213
|
+
from coord.state import update_assignment_cost, update_assignment_tokens # noqa: PLC0415
|
|
2214
|
+
from coord.usage import parse_usage_from_log # noqa: PLC0415
|
|
2215
|
+
|
|
2216
|
+
parsed = None
|
|
2217
|
+
if log_path:
|
|
2218
|
+
try:
|
|
2219
|
+
parsed = parse_usage_from_log(Path(log_path), provider_name=provider_name)
|
|
2220
|
+
except Exception as exc: # noqa: BLE001
|
|
2221
|
+
log.debug(
|
|
2222
|
+
"_capture_cost_and_tokens_for_review: local parse failed for %s: %s",
|
|
2223
|
+
assignment_id, exc,
|
|
2224
|
+
)
|
|
2225
|
+
parsed = None
|
|
2226
|
+
|
|
2227
|
+
if parsed is None and host:
|
|
2228
|
+
text = _fetch_raw_log_text_by_id(assignment_id, None, host)
|
|
2229
|
+
if text:
|
|
2230
|
+
import tempfile # noqa: PLC0415
|
|
2231
|
+
|
|
2232
|
+
try:
|
|
2233
|
+
with tempfile.NamedTemporaryFile(
|
|
2234
|
+
mode="w", suffix=".log", delete=True
|
|
2235
|
+
) as tf:
|
|
2236
|
+
tf.write(text)
|
|
2237
|
+
tf.flush()
|
|
2238
|
+
parsed = parse_usage_from_log(
|
|
2239
|
+
Path(tf.name), provider_name=provider_name
|
|
2240
|
+
)
|
|
2241
|
+
except Exception as exc: # noqa: BLE001
|
|
2242
|
+
log.debug(
|
|
2243
|
+
"_capture_cost_and_tokens_for_review: remote parse failed "
|
|
2244
|
+
"for %s: %s", assignment_id, exc,
|
|
2245
|
+
)
|
|
2246
|
+
parsed = None
|
|
2247
|
+
|
|
2248
|
+
if parsed is None:
|
|
2249
|
+
return False
|
|
2250
|
+
|
|
2251
|
+
wrote = False
|
|
2252
|
+
if parsed.total_cost_usd and parsed.total_cost_usd > 0:
|
|
2253
|
+
try:
|
|
2254
|
+
update_assignment_cost(assignment_id, parsed.total_cost_usd)
|
|
2255
|
+
wrote = True
|
|
2256
|
+
except Exception as exc: # noqa: BLE001
|
|
2257
|
+
log.warning(
|
|
2258
|
+
"_capture_cost_and_tokens_for_review: failed to persist cost "
|
|
2259
|
+
"for %s: %s", assignment_id, exc,
|
|
2260
|
+
)
|
|
2261
|
+
|
|
2262
|
+
token_total = (
|
|
2263
|
+
parsed.input_tokens + parsed.output_tokens
|
|
2264
|
+
+ parsed.cache_creation_tokens + parsed.cache_read_tokens
|
|
2265
|
+
)
|
|
2266
|
+
if token_total > 0:
|
|
2267
|
+
try:
|
|
2268
|
+
update_assignment_tokens(
|
|
2269
|
+
assignment_id,
|
|
2270
|
+
input_tokens=parsed.input_tokens,
|
|
2271
|
+
output_tokens=parsed.output_tokens,
|
|
2272
|
+
cache_creation_tokens=parsed.cache_creation_tokens,
|
|
2273
|
+
cache_read_tokens=parsed.cache_read_tokens,
|
|
2274
|
+
)
|
|
2275
|
+
wrote = True
|
|
2276
|
+
except Exception as exc: # noqa: BLE001
|
|
2277
|
+
log.warning(
|
|
2278
|
+
"_capture_cost_and_tokens_for_review: failed to persist "
|
|
2279
|
+
"tokens for %s: %s", assignment_id, exc,
|
|
2280
|
+
)
|
|
2281
|
+
|
|
2282
|
+
return wrote
|
|
2283
|
+
|
|
2284
|
+
|
|
2161
2285
|
def _warn_missing_review_verdict(
|
|
2162
2286
|
transition: Transition, entry: dict, diagnostic: list,
|
|
2163
2287
|
) -> None:
|
|
@@ -2832,6 +2956,20 @@ def post_orphaned_review_findings(
|
|
|
2832
2956
|
for row in rows:
|
|
2833
2957
|
aid = row["assignment_id"]
|
|
2834
2958
|
log_path = log_by_id.get(aid)
|
|
2959
|
+
|
|
2960
|
+
# #2476: capture cost/tokens for this row too. This is the ONLY
|
|
2961
|
+
# place a review whose verdict is being recovered here (rather
|
|
2962
|
+
# than through the direct detect_transitions → post_transition
|
|
2963
|
+
# path, which already calls `_capture_cost`) ever gets a chance
|
|
2964
|
+
# at cost/token capture — once `posted`/`mark_notified` below
|
|
2965
|
+
# lands, nothing ever revisits this row. Independent of whether
|
|
2966
|
+
# findings parsing succeeds: a row whose body can't be recovered
|
|
2967
|
+
# can still have its cost recovered from the same log.
|
|
2968
|
+
_capture_cost_and_tokens_for_review(
|
|
2969
|
+
aid, log_path=log_path, host=machine.host,
|
|
2970
|
+
provider_name=row.get("provider_name"),
|
|
2971
|
+
)
|
|
2972
|
+
|
|
2835
2973
|
findings = None
|
|
2836
2974
|
# Try local file first (cheap) — works when notify runs on the
|
|
2837
2975
|
# same host as the agent. Falls back to fetching via HTTP so the
|
|
@@ -3248,6 +3248,13 @@ def load_done_reviews_needing_post(repo_name: str | None = None) -> list[dict]:
|
|
|
3248
3248
|
"review_of_assignment_id": a.get("review_of_assignment_id"),
|
|
3249
3249
|
"review_target": a.get("review_target"),
|
|
3250
3250
|
"status": a.get("status"),
|
|
3251
|
+
# #2476: threaded through to
|
|
3252
|
+
# coord.notify._capture_cost_and_tokens_for_review so
|
|
3253
|
+
# post_orphaned_review_findings' cost/token capture
|
|
3254
|
+
# resolves the right Provider instead of always
|
|
3255
|
+
# assuming claude (mirrors the #1710 provider_name
|
|
3256
|
+
# threading everywhere else cost is parsed).
|
|
3257
|
+
"provider_name": a.get("provider_name"),
|
|
3251
3258
|
})
|
|
3252
3259
|
return results
|
|
3253
3260
|
except Exception: # noqa: BLE001 — daemon unreachable → local fallback
|
|
@@ -3277,6 +3284,80 @@ def _load_done_reviews_needing_post_local(repo_name: str | None = None) -> list[
|
|
|
3277
3284
|
return [_row_to_dispatched_dict(row) for row in rows]
|
|
3278
3285
|
|
|
3279
3286
|
|
|
3287
|
+
def load_review_assignments_missing_cost(repo_name: str | None = None) -> list[dict]:
|
|
3288
|
+
"""#2476: return terminal review assignments whose cost was never
|
|
3289
|
+
captured (``cost_usd IS NULL OR cost_usd = 0``).
|
|
3290
|
+
|
|
3291
|
+
Feeds ``coord backfill-review-cost`` — the one-shot repair for the
|
|
3292
|
+
already-lost data the #2476 capture gap left behind. Unlike
|
|
3293
|
+
:func:`load_done_reviews_needing_post` this is NOT scoped to
|
|
3294
|
+
``status='done'``/``review_posted_at IS NULL`` — a review can be
|
|
3295
|
+
terminal (``done``/``failed``/``advisory``) with a perfectly good
|
|
3296
|
+
verdict already posted and STILL be missing cost, since the capture gap
|
|
3297
|
+
is independent of whether the findings post succeeded. Excludes
|
|
3298
|
+
``running``/``pending``/``finalizing`` rows: a still-in-flight or
|
|
3299
|
+
not-yet-promoted review has no final cost to recover yet — the live
|
|
3300
|
+
capture path (or a later backfill run) is the right place for those,
|
|
3301
|
+
not a one-shot repair racing an in-progress worker.
|
|
3302
|
+
|
|
3303
|
+
Optionally filtered to a single repo by *repo_name*. Returns dicts in
|
|
3304
|
+
the same shape as :func:`load_done_reviews_needing_post` (including
|
|
3305
|
+
``provider_name`` for :func:`coord.notify._capture_cost_and_tokens_for_review`).
|
|
3306
|
+
|
|
3307
|
+
**Daemon-aware:** mirrors :func:`load_done_reviews_needing_post` — reads
|
|
3308
|
+
the ``GET /board`` payload when a ``board_service`` is configured so a
|
|
3309
|
+
thin client sees the real candidates instead of an empty local table.
|
|
3310
|
+
"""
|
|
3311
|
+
svc = _board_service()
|
|
3312
|
+
if svc is not None:
|
|
3313
|
+
try:
|
|
3314
|
+
from coord.client import fetch_board_payload # noqa: PLC0415
|
|
3315
|
+
|
|
3316
|
+
payload = fetch_board_payload(svc)
|
|
3317
|
+
results: list[dict] = []
|
|
3318
|
+
for a in payload.get("assignments", []):
|
|
3319
|
+
if (
|
|
3320
|
+
a.get("type") == "review"
|
|
3321
|
+
and a.get("status") not in ("running", "pending", "finalizing")
|
|
3322
|
+
and not (a.get("cost_usd") or 0)
|
|
3323
|
+
and (repo_name is None or a.get("repo_name") == repo_name)
|
|
3324
|
+
):
|
|
3325
|
+
results.append({
|
|
3326
|
+
"assignment_id": a.get("assignment_id"),
|
|
3327
|
+
"machine_name": a.get("machine_name", ""),
|
|
3328
|
+
"repo_name": a.get("repo_name", ""),
|
|
3329
|
+
"repo_github": a.get("repo_github"),
|
|
3330
|
+
"issue_number": a.get("issue_number", 0),
|
|
3331
|
+
"issue_title": a.get("issue_title", ""),
|
|
3332
|
+
"status": a.get("status"),
|
|
3333
|
+
"provider_name": a.get("provider_name"),
|
|
3334
|
+
})
|
|
3335
|
+
return results
|
|
3336
|
+
except Exception: # noqa: BLE001 — daemon unreachable → local fallback
|
|
3337
|
+
pass
|
|
3338
|
+
return _load_review_assignments_missing_cost_local(repo_name=repo_name)
|
|
3339
|
+
|
|
3340
|
+
|
|
3341
|
+
def _load_review_assignments_missing_cost_local(repo_name: str | None = None) -> list[dict]:
|
|
3342
|
+
"""Local-DB read for :func:`load_review_assignments_missing_cost`."""
|
|
3343
|
+
conn = get_connection()
|
|
3344
|
+
where = (
|
|
3345
|
+
"type='review' AND status NOT IN ('running', 'pending', 'finalizing') "
|
|
3346
|
+
"AND (cost_usd IS NULL OR cost_usd = 0)"
|
|
3347
|
+
)
|
|
3348
|
+
if repo_name:
|
|
3349
|
+
rows = conn.execute(
|
|
3350
|
+
f"SELECT * FROM assignments WHERE {where} AND repo_name=? "
|
|
3351
|
+
"ORDER BY finished_at",
|
|
3352
|
+
(repo_name,),
|
|
3353
|
+
).fetchall()
|
|
3354
|
+
else:
|
|
3355
|
+
rows = conn.execute(
|
|
3356
|
+
f"SELECT * FROM assignments WHERE {where} ORDER BY finished_at",
|
|
3357
|
+
).fetchall()
|
|
3358
|
+
return [_row_to_dispatched_dict(row) for row in rows]
|
|
3359
|
+
|
|
3360
|
+
|
|
3280
3361
|
# ── Plan persistence ────────────────────────────────────────────────────────────
|
|
3281
3362
|
|
|
3282
3363
|
def save_plan(assignment_id: str, plan_dict: dict) -> None:
|