code-coordinator 0.5.187__tar.gz → 0.5.189__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.187 → code_coordinator-0.5.189}/PKG-INFO +1 -1
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agent.py +71 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/cli.py +2 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/merge.py +79 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notify.py +144 -12
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/providers/claude.py +19 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/providers/claude_pty.py +11 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/state.py +81 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent.py +111 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_merge.py +116 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notify.py +171 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_providers_pty.py +34 -2
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_state.py +97 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worker_test_scoping.py +23 -4
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.gitignore +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/CLAUDE.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/GOAL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/LICENSE +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/MANIFEST.in +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/README.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/__init__.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/audit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/block_log.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/board_service.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/brain.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/claim.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/client.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/comments.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/config.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dao.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/db.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deps.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/drive.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/events.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/filelock.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/freshness.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/gates.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/goal.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/context.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/models.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/render.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/units.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/hooks.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/interactive.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/models.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/network.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/openapi.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/parentage.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/plans.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/progress.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/release_window.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/reports.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/review.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/self_health.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/smoke.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/split_work.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/test_author.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/test_report.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/usage.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/install-agent.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/pyproject.toml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/setup.cfg +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/__init__.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/conftest.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_db.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_events.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_init.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_models.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_network.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_session.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_split.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -3678,6 +3678,49 @@ NEW_ISSUE_CHAT_DENY_COMMANDS: list[str] = [
|
|
|
3678
3678
|
]
|
|
3679
3679
|
|
|
3680
3680
|
|
|
3681
|
+
# Deny list applied to review workers (#2461). Unlike every other member of
|
|
3682
|
+
# WRITE_CAPABLE_SPEC_TYPES, a reviewer has ZERO legitimate mutations of its
|
|
3683
|
+
# own — coord.review.REVIEWER_SYSTEM_PROMPT already tells it "You are NOT
|
|
3684
|
+
# allowed to push commits or modify the PR's code. You only review" and "You
|
|
3685
|
+
# are NOT allowed to run any `gh` commands" (the coordinator posts the
|
|
3686
|
+
# review on its behalf after the session ends). Before #2461 that was
|
|
3687
|
+
# enforced by the PROMPT ALONE: `"review"` wasn't one of the explicit
|
|
3688
|
+
# branches in `default_worker_command`, so it fell through to the generic
|
|
3689
|
+
# `else` below and got the exact same `Read,Edit,Write,Bash,Monitor` grant as
|
|
3690
|
+
# a real work leg — nothing but the model's own good behaviour stood between
|
|
3691
|
+
# "read the diff" and "silently commit a fix and push it". This list is
|
|
3692
|
+
# wired into BOTH the system prompt (via `build_deny_prompt`, soft — a
|
|
3693
|
+
# reminder) AND `--disallowedTools` (CLI-enforced, hard — see the
|
|
3694
|
+
# `spec.type == "review"` branch below) so a reviewer that ignores its own
|
|
3695
|
+
# prompt still cannot shell out to a mutating git/gh command. The read-only
|
|
3696
|
+
# git the briefing actually tells reviewers to run (`git fetch`, `git diff`,
|
|
3697
|
+
# `git log`) stays allowed by omission.
|
|
3698
|
+
REVIEW_DENY_COMMANDS: list[str] = [
|
|
3699
|
+
"Bash(gh *)",
|
|
3700
|
+
"Bash(git push *)",
|
|
3701
|
+
"Bash(git commit *)",
|
|
3702
|
+
"Bash(git add *)",
|
|
3703
|
+
"Bash(git merge *)",
|
|
3704
|
+
"Bash(git rebase *)",
|
|
3705
|
+
"Bash(git cherry-pick *)",
|
|
3706
|
+
"Bash(git reset *)",
|
|
3707
|
+
"Bash(git checkout *)",
|
|
3708
|
+
"Bash(git switch *)",
|
|
3709
|
+
"Bash(git branch *)",
|
|
3710
|
+
"Bash(git stash *)",
|
|
3711
|
+
"Bash(git clean *)",
|
|
3712
|
+
"Bash(git rm *)",
|
|
3713
|
+
"Bash(git apply *)",
|
|
3714
|
+
"Bash(git am *)",
|
|
3715
|
+
"Bash(git tag *)",
|
|
3716
|
+
"Bash(rm -rf *)",
|
|
3717
|
+
"Bash(rm -fr *)",
|
|
3718
|
+
"Bash(coord approve *)",
|
|
3719
|
+
"Bash(coord merge *)",
|
|
3720
|
+
"Bash(coord assign *)",
|
|
3721
|
+
]
|
|
3722
|
+
|
|
3723
|
+
|
|
3681
3724
|
WorkerCommandBuilder = Callable[[AssignmentSpec], list[str]]
|
|
3682
3725
|
|
|
3683
3726
|
|
|
@@ -4111,6 +4154,26 @@ def default_worker_command(spec: AssignmentSpec, *, binary: str = DEFAULT_WORKER
|
|
|
4111
4154
|
system_prompt = spec.system_prompt if spec.system_prompt else SMOKE_SYSTEM_PROMPT
|
|
4112
4155
|
system_prompt += build_deny_prompt(spec.deny_commands)
|
|
4113
4156
|
allowed_tools = "Read,Bash"
|
|
4157
|
+
elif spec.type == "review":
|
|
4158
|
+
# #2461: give review its own branch instead of falling through to
|
|
4159
|
+
# the generic `else` below — see REVIEW_DENY_COMMANDS for the full
|
|
4160
|
+
# story. A reviewer reads the diff and reports a verdict; it edits
|
|
4161
|
+
# and pushes nothing, so it gets no Edit/Write. `Monitor` is
|
|
4162
|
+
# withheld too, for the same #1394/#2301 reason the `smoke` branch
|
|
4163
|
+
# above withholds it: a review leg is a one-shot `claude -p`
|
|
4164
|
+
# session, and an await-a-notification tool that only resumes an
|
|
4165
|
+
# INTERACTIVE session would silently kill it mid-run.
|
|
4166
|
+
#
|
|
4167
|
+
# A scratch/tmp path outside the worktree (e.g. `/tmp/...`) stays
|
|
4168
|
+
# writable for a reviewer that wants to stage its findings before
|
|
4169
|
+
# the final `coord report-result --body-file` call — Bash retains
|
|
4170
|
+
# ordinary shell redirection (`cat >`, heredocs) even with no Write
|
|
4171
|
+
# tool grant; only the Edit/Write *tools* (which target the
|
|
4172
|
+
# worktree/repo) and the mutating git/gh commands below are blocked.
|
|
4173
|
+
from coord.review import REVIEWER_SYSTEM_PROMPT # noqa: PLC0415
|
|
4174
|
+
system_prompt = spec.system_prompt if spec.system_prompt else REVIEWER_SYSTEM_PROMPT
|
|
4175
|
+
system_prompt += build_deny_prompt(REVIEW_DENY_COMMANDS)
|
|
4176
|
+
allowed_tools = "Read,Bash"
|
|
4114
4177
|
else:
|
|
4115
4178
|
system_prompt = spec.system_prompt if spec.system_prompt else WORKER_SYSTEM_PROMPT
|
|
4116
4179
|
system_prompt += build_deny_prompt(spec.deny_commands)
|
|
@@ -4177,6 +4240,14 @@ def default_worker_command(spec: AssignmentSpec, *, binary: str = DEFAULT_WORKER
|
|
|
4177
4240
|
for pattern in _base_checkout_write_guard_tools(spec.repo_path):
|
|
4178
4241
|
if pattern not in disallowed_tools:
|
|
4179
4242
|
disallowed_tools.append(pattern)
|
|
4243
|
+
# #2461: review gets its mutating-command deny list wired into
|
|
4244
|
+
# --disallowedTools too, not just the soft system-prompt reminder from
|
|
4245
|
+
# build_deny_prompt above — the CLI enforces this one even if the model
|
|
4246
|
+
# decides to ignore its own prompt.
|
|
4247
|
+
if spec.type == "review":
|
|
4248
|
+
for pattern in REVIEW_DENY_COMMANDS:
|
|
4249
|
+
if pattern not in disallowed_tools:
|
|
4250
|
+
disallowed_tools.append(pattern)
|
|
4180
4251
|
if disallowed_tools:
|
|
4181
4252
|
argv.extend(["--disallowedTools", ",".join(disallowed_tools)])
|
|
4182
4253
|
# #315: when resuming a prior chat session, load the prior conversation so
|
|
@@ -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)
|
|
@@ -883,6 +883,85 @@ def post_pending_reviews(config_path: Path, repo_name: str | None) -> None:
|
|
|
883
883
|
)
|
|
884
884
|
|
|
885
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
|
+
|
|
886
965
|
def _load_issue_states() -> tuple[dict[str, set[int]], dict[str, set[int]]]:
|
|
887
966
|
"""Return ``(open_by_repo, known_by_repo)``.
|
|
888
967
|
|
|
@@ -2133,28 +2133,26 @@ def _persist_review_findings(assignment_id: str, verdict: str, body: str) -> Non
|
|
|
2133
2133
|
)
|
|
2134
2134
|
|
|
2135
2135
|
|
|
2136
|
-
def
|
|
2137
|
-
|
|
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.
|
|
2138
2140
|
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
``None`` on any I/O failure — diagnostics are best-effort by design and
|
|
2145
|
-
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.
|
|
2146
2146
|
"""
|
|
2147
|
-
log_path = entry.get("log_path")
|
|
2148
2147
|
if log_path:
|
|
2149
2148
|
try:
|
|
2150
2149
|
return Path(log_path).read_text(encoding="utf-8", errors="replace")
|
|
2151
2150
|
except OSError:
|
|
2152
2151
|
pass
|
|
2153
|
-
host = _agent_host(transition.machine_name)
|
|
2154
2152
|
if host:
|
|
2155
2153
|
try:
|
|
2156
2154
|
resp = httpx.get(
|
|
2157
|
-
f"http://{host}:{AGENT_PORT}/logs/{
|
|
2155
|
+
f"http://{host}:{AGENT_PORT}/logs/{assignment_id}",
|
|
2158
2156
|
timeout=15.0,
|
|
2159
2157
|
)
|
|
2160
2158
|
resp.raise_for_status()
|
|
@@ -2164,6 +2162,126 @@ def _fetch_raw_log_text(transition: Transition, entry: dict) -> str | None:
|
|
|
2164
2162
|
return None
|
|
2165
2163
|
|
|
2166
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
|
+
|
|
2167
2285
|
def _warn_missing_review_verdict(
|
|
2168
2286
|
transition: Transition, entry: dict, diagnostic: list,
|
|
2169
2287
|
) -> None:
|
|
@@ -2838,6 +2956,20 @@ def post_orphaned_review_findings(
|
|
|
2838
2956
|
for row in rows:
|
|
2839
2957
|
aid = row["assignment_id"]
|
|
2840
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
|
+
|
|
2841
2973
|
findings = None
|
|
2842
2974
|
# Try local file first (cheap) — works when notify runs on the
|
|
2843
2975
|
# same host as the agent. Falls back to fetching via HTTP so the
|
|
@@ -113,6 +113,7 @@ class ClaudeProvider(Provider):
|
|
|
113
113
|
NEW_ISSUE_CHAT_DENY_COMMANDS,
|
|
114
114
|
NEW_ISSUE_CHAT_SYSTEM_PROMPT,
|
|
115
115
|
REFINEMENT_SYSTEM_PROMPT,
|
|
116
|
+
REVIEW_DENY_COMMANDS,
|
|
116
117
|
TEST_CHAT_SYSTEM_PROMPT,
|
|
117
118
|
WORKER_PLAN_PROMPT,
|
|
118
119
|
WORKER_SYSTEM_PROMPT,
|
|
@@ -120,6 +121,7 @@ class ClaudeProvider(Provider):
|
|
|
120
121
|
_sealed_write_guard_tools,
|
|
121
122
|
build_deny_prompt,
|
|
122
123
|
)
|
|
124
|
+
from coord.review import REVIEWER_SYSTEM_PROMPT # noqa: PLC0415
|
|
123
125
|
from coord.smoke import SMOKE_SYSTEM_PROMPT # noqa: PLC0415
|
|
124
126
|
|
|
125
127
|
binary = self._binary if self._binary is not None else DEFAULT_WORKER_BINARY
|
|
@@ -180,6 +182,17 @@ class ClaudeProvider(Provider):
|
|
|
180
182
|
_sp = spec.system_prompt if spec.system_prompt else SMOKE_SYSTEM_PROMPT
|
|
181
183
|
_sp += build_deny_prompt(spec.deny_commands)
|
|
182
184
|
_at = "Read,Bash"
|
|
185
|
+
elif spec.type == "review":
|
|
186
|
+
# #2461: keep in sync with default_worker_command's identical
|
|
187
|
+
# branch — a reviewer reads the diff and reports a verdict,
|
|
188
|
+
# it edits and pushes nothing, so Read,Bash only (no
|
|
189
|
+
# Edit/Write, no Monitor — same one-shot-session reasoning as
|
|
190
|
+
# the `smoke` branch above). See REVIEW_DENY_COMMANDS for why
|
|
191
|
+
# its mutating-command deny list also lands in
|
|
192
|
+
# --disallowedTools below, not just this prompt text.
|
|
193
|
+
_sp = spec.system_prompt if spec.system_prompt else REVIEWER_SYSTEM_PROMPT
|
|
194
|
+
_sp += build_deny_prompt(REVIEW_DENY_COMMANDS)
|
|
195
|
+
_at = "Read,Bash"
|
|
183
196
|
else:
|
|
184
197
|
_sp = spec.system_prompt if spec.system_prompt else WORKER_SYSTEM_PROMPT
|
|
185
198
|
_sp += build_deny_prompt(spec.deny_commands)
|
|
@@ -217,6 +230,12 @@ class ClaudeProvider(Provider):
|
|
|
217
230
|
for pattern in _base_checkout_write_guard_tools(spec.repo_path):
|
|
218
231
|
if pattern not in disallowed_tools:
|
|
219
232
|
disallowed_tools.append(pattern)
|
|
233
|
+
# #2461: same CLI-enforced hard block as default_worker_command —
|
|
234
|
+
# see REVIEW_DENY_COMMANDS.
|
|
235
|
+
if spec.type == "review":
|
|
236
|
+
for pattern in REVIEW_DENY_COMMANDS:
|
|
237
|
+
if pattern not in disallowed_tools:
|
|
238
|
+
disallowed_tools.append(pattern)
|
|
220
239
|
if disallowed_tools:
|
|
221
240
|
argv.extend(["--disallowedTools", ",".join(disallowed_tools)])
|
|
222
241
|
if spec.resume_session_id:
|
|
@@ -433,6 +433,7 @@ class ClaudePtyProvider(Provider):
|
|
|
433
433
|
NEW_ISSUE_CHAT_DENY_COMMANDS,
|
|
434
434
|
NEW_ISSUE_CHAT_SYSTEM_PROMPT,
|
|
435
435
|
REFINEMENT_SYSTEM_PROMPT,
|
|
436
|
+
REVIEW_DENY_COMMANDS,
|
|
436
437
|
TEST_CHAT_SYSTEM_PROMPT,
|
|
437
438
|
WORKER_PLAN_PROMPT,
|
|
438
439
|
WORKER_SYSTEM_PROMPT,
|
|
@@ -497,6 +498,16 @@ class ClaudePtyProvider(Provider):
|
|
|
497
498
|
_sp = spec.system_prompt if spec.system_prompt else SMOKE_SYSTEM_PROMPT
|
|
498
499
|
_sp += build_deny_prompt(spec.deny_commands)
|
|
499
500
|
_at = "Read,Bash"
|
|
501
|
+
elif spec.type == "review":
|
|
502
|
+
# #2461: keep in sync with default_worker_command's identical
|
|
503
|
+
# branch — a reviewer reads the diff and reports a verdict,
|
|
504
|
+
# it edits and pushes nothing, so Read,Bash only (no
|
|
505
|
+
# Edit/Write, no Monitor — same one-shot-session reasoning as
|
|
506
|
+
# the `smoke` branch above).
|
|
507
|
+
from coord.review import REVIEWER_SYSTEM_PROMPT # noqa: PLC0415
|
|
508
|
+
_sp = spec.system_prompt if spec.system_prompt else REVIEWER_SYSTEM_PROMPT
|
|
509
|
+
_sp += build_deny_prompt(REVIEW_DENY_COMMANDS)
|
|
510
|
+
_at = "Read,Bash"
|
|
500
511
|
else:
|
|
501
512
|
_sp = spec.system_prompt if spec.system_prompt else WORKER_SYSTEM_PROMPT
|
|
502
513
|
_sp += build_deny_prompt(spec.deny_commands)
|
|
@@ -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:
|