code-coordinator 0.5.225__tar.gz → 0.5.227__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.225 → code_coordinator-0.5.227}/CLAUDE.md +12 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/PKG-INFO +1 -1
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/reconcile.py +134 -29
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/test_author.py +50 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_drive.py +6 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_no_agent_record.py +186 -1
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_author.py +82 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/.gitignore +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/GOAL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/LICENSE +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/MANIFEST.in +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/README.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/__init__.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agent.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/audit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/block_log.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/board_service.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/brain.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/claim.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/cli.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/client.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/comments.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/config.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dao.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/db.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/deps.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/drive.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/events.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/filelock.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/freshness.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/gates.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/goal.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/context.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/models.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/render.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/health/units.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/hooks.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/interactive.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/models.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/network.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/notify.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/openapi.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/parentage.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/plans.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/progress.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/release_window.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/reports.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/review.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/self_health.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/smoke.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/split_work.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/state.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/test_report.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/usage.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/install-agent.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/pyproject.toml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/setup.cfg +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/__init__.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/conftest.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_db.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_events.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_init.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_models.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_network.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_session.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_split.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_state.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.225 → code_coordinator-0.5.227}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -201,6 +201,18 @@ The operator-side counterparts to these rules (dispatch economics, what to send
|
|
|
201
201
|
versus keep in the coordinator session) are in
|
|
202
202
|
[`docs/COST_DISCIPLINE.md`](docs/COST_DISCIPLINE.md).
|
|
203
203
|
|
|
204
|
+
## Rules for the coordinator session
|
|
205
|
+
|
|
206
|
+
- **Prefer `coord issue` / `coord repo` / `coord milestone` over raw `gh`.** Workers can't reach
|
|
207
|
+
`gh` at all (deny-listed, above); an interactive coordinator session technically can, but should
|
|
208
|
+
still route issue/PR/milestone reads and writes through the `coord` seam wherever a subcommand
|
|
209
|
+
covers it — that's what keeps the backend-agnostic forge seam
|
|
210
|
+
([`docs/FORGE_MIGRATION.md`](docs/FORGE_MIGRATION.md)) actually exercised instead of quietly
|
|
211
|
+
bypassed by the one class of session most likely to reach for `gh` out of habit. Where no `coord`
|
|
212
|
+
subcommand covers what's needed — a real gap as of 2026-08 (e.g. #2484: `coord issue` has no
|
|
213
|
+
`list`/`view`) — falling back to `gh` for that one read is fine, but say so and treat it as a gap
|
|
214
|
+
to flag or file, not a silent workaround.
|
|
215
|
+
|
|
204
216
|
## Testing — black-box coverage is the acceptance bar
|
|
205
217
|
|
|
206
218
|
**Every PR that changes user-visible behavior must ship a black-box test** that drives the *running app* and asserts on its rendered output — not just unit tests on internal functions. The adversarial reviewer reads this file and **rejects behavior-changing PRs that lack one** (pure refactors / internal-only changes are exempt — say so in the PR if that applies). Build the **harness once per repo**; add **tests incrementally, one (or a few) per behavior-changing issue** — do *not* big-bang a full suite. Coverage then grows with churn and ratchets up (PRs add coverage, never remove it). Keep a thin **core smoke set** over the few most-trafficked screens so critical flows stay guarded even by unrelated changes.
|
|
@@ -203,6 +203,7 @@ def reconcile_completed_assignments(
|
|
|
203
203
|
agent_status_fn=_query_agent,
|
|
204
204
|
update_state_fn=None,
|
|
205
205
|
capture_plan: bool = True,
|
|
206
|
+
commits_ahead_fn=None,
|
|
206
207
|
) -> list[dict]:
|
|
207
208
|
"""Dispatch-free passive completion reconcile (#625).
|
|
208
209
|
|
|
@@ -275,9 +276,22 @@ def reconcile_completed_assignments(
|
|
|
275
276
|
The fix is a positive disproof: ``/status`` carries both ``active`` and
|
|
276
277
|
``completed``, and an id in NEITHER is a statement about the agent's state,
|
|
277
278
|
not an inference from its silence. Those — and only those — are
|
|
278
|
-
reconciled, to ``
|
|
279
|
-
|
|
280
|
-
|
|
279
|
+
reconciled, never to ``done``, with :data:`NO_AGENT_RECORD_REASON`. See
|
|
280
|
+
:func:`agent_has_no_record` and :func:`_reconcile_no_agent_record`.
|
|
281
|
+
|
|
282
|
+
**#2553 — "the agent forgot" is not "the work is gone".** The arm above
|
|
283
|
+
used to record ``failed`` unconditionally, but "the agent has no record"
|
|
284
|
+
is evidence about the agent's memory, not about the work: a
|
|
285
|
+
:data:`~coord.models.WORK_LIKE_TYPES` row's own ``branch`` is the one
|
|
286
|
+
artifact in this path that survives an agent restart, a machine reboot,
|
|
287
|
+
and the 25-entry completion-history cap, and the board row already has
|
|
288
|
+
its name. :func:`_reconcile_no_agent_record` now consults it
|
|
289
|
+
(``commits_ahead_fn``, defaulting to :func:`coord.github_ops.
|
|
290
|
+
branch_commits_ahead_for_assignment`) before choosing ``failed`` — a
|
|
291
|
+
branch with real commits ahead of its base lands on ``advisory`` instead
|
|
292
|
+
(work exists, provenance unverified, needs a human or a verify pass),
|
|
293
|
+
naming the branch in the reason so an operator doesn't have to go
|
|
294
|
+
spelunking for it.
|
|
281
295
|
|
|
282
296
|
Three guards, because **this arm reaps** and #1658 is what getting that
|
|
283
297
|
wrong looks like in production:
|
|
@@ -301,6 +315,12 @@ def reconcile_completed_assignments(
|
|
|
301
315
|
#1421's handler) — and there the workers really are gone, so reconciling
|
|
302
316
|
every row on that machine is the correct answer rather than an accident.
|
|
303
317
|
|
|
318
|
+
``commits_ahead_fn`` (#2553) is the injectable seam for the branch check
|
|
319
|
+
above — ``fn(assignment, config) -> int | None`` — defaulting to
|
|
320
|
+
:func:`coord.github_ops.branch_commits_ahead_for_assignment`. Tests stub
|
|
321
|
+
it to avoid a real ``gh`` call, exactly like ``agent_status_fn`` stubs the
|
|
322
|
+
real agent poll.
|
|
323
|
+
|
|
304
324
|
Returns one dict per reconciled assignment (empty when nothing changed).
|
|
305
325
|
"""
|
|
306
326
|
if update_state_fn is None:
|
|
@@ -308,6 +328,11 @@ def reconcile_completed_assignments(
|
|
|
308
328
|
|
|
309
329
|
update_state_fn = _update_local_state
|
|
310
330
|
|
|
331
|
+
if commits_ahead_fn is None:
|
|
332
|
+
from coord import github_ops # noqa: PLC0415
|
|
333
|
+
|
|
334
|
+
commits_ahead_fn = github_ops.branch_commits_ahead_for_assignment
|
|
335
|
+
|
|
311
336
|
if board is None:
|
|
312
337
|
from coord.state import build_board # noqa: PLC0415
|
|
313
338
|
|
|
@@ -352,7 +377,10 @@ def reconcile_completed_assignments(
|
|
|
352
377
|
and not is_attended_session(a)
|
|
353
378
|
and _no_record_grace_elapsed(a)
|
|
354
379
|
):
|
|
355
|
-
_reconcile_no_agent_record(
|
|
380
|
+
_reconcile_no_agent_record(
|
|
381
|
+
a, aid, update_state_fn, reconciled,
|
|
382
|
+
config=config, commits_ahead_fn=commits_ahead_fn,
|
|
383
|
+
)
|
|
356
384
|
continue
|
|
357
385
|
# #1534: `effective_agent_status` refuses an agent-reported `done`
|
|
358
386
|
# that also carries a usage-limit-kill reason — the daemon's passive
|
|
@@ -516,49 +544,123 @@ def reconcile_completed_assignments(
|
|
|
516
544
|
return reconciled
|
|
517
545
|
|
|
518
546
|
|
|
547
|
+
def _no_agent_record_branch_reason(branch: str, ahead: int) -> str:
|
|
548
|
+
"""#2553's operator-facing reason for the "work is on the branch" half.
|
|
549
|
+
|
|
550
|
+
Distinct from :data:`NO_AGENT_RECORD_REASON` (the "nothing was pushed"
|
|
551
|
+
half) precisely so the two are told apart at a glance — the acceptance
|
|
552
|
+
bar for #2553 is that the reason NAMES the branch rather than making an
|
|
553
|
+
operator go looking for it, since that branch is the whole point: it is
|
|
554
|
+
the one artifact of this leg that survived the agent's amnesia.
|
|
555
|
+
"""
|
|
556
|
+
return (
|
|
557
|
+
"agent has no record of this assignment (present in neither its "
|
|
558
|
+
"/status `active` nor `completed` list), but its branch "
|
|
559
|
+
f"`{branch}` has {ahead} commit(s) ahead of its base — the worker "
|
|
560
|
+
"pushed real work before the agent's record of it was lost. "
|
|
561
|
+
"Provenance is unverified (no worker ever reported a verdict), so "
|
|
562
|
+
"this is recorded as advisory rather than failed: it needs a human "
|
|
563
|
+
"or a verify pass, not to be discarded (#2553)"
|
|
564
|
+
)
|
|
565
|
+
|
|
566
|
+
|
|
519
567
|
def _reconcile_no_agent_record(
|
|
520
568
|
a: Assignment,
|
|
521
569
|
aid: str,
|
|
522
570
|
update_state_fn,
|
|
523
571
|
reconciled: list[dict],
|
|
572
|
+
*,
|
|
573
|
+
config: Config,
|
|
574
|
+
commits_ahead_fn,
|
|
524
575
|
) -> None:
|
|
525
|
-
"""#2275: flip a ``running`` row the agent has no record of to
|
|
576
|
+
"""#2275: flip a ``running`` row the agent has no record of to a terminal
|
|
577
|
+
status — ``failed`` by default, or ``advisory`` when #2553's branch check
|
|
578
|
+
below finds the row's own branch outlived the agent's amnesia.
|
|
526
579
|
|
|
527
580
|
Called from :func:`reconcile_completed_assignments` only, and only once
|
|
528
581
|
all three guards there have passed (positive disproof, not attended, past
|
|
529
582
|
the grace window).
|
|
530
583
|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
acceptance gate, the merge queue)
|
|
535
|
-
nobody ever produced. A stall is
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
``
|
|
541
|
-
|
|
542
|
-
|
|
584
|
+
**Never ``done``.** This leg never reported a verdict, so the one thing
|
|
585
|
+
that must not happen — regardless of which terminal status below fires —
|
|
586
|
+
is a silent flip to ``done``: that manufactures a pass and every
|
|
587
|
+
downstream gate (review dispatch, the acceptance gate, the merge queue)
|
|
588
|
+
then behaves as if a slice exists that nobody ever produced. A stall is
|
|
589
|
+
bad; a manufactured pass is worse.
|
|
590
|
+
|
|
591
|
+
**#2553 — "the agent forgot" is evidence about the agent, not the work.**
|
|
592
|
+
Before this, every row reaching here was unconditionally recorded
|
|
593
|
+
``failed`` with :data:`NO_AGENT_RECORD_REASON`, even when the row's own
|
|
594
|
+
``branch`` carried real, pushed commits — stranding that work with no
|
|
595
|
+
second chance (most visible on ``test-author``, whose sealed-path rule
|
|
596
|
+
means nothing else will ever pick the branch back up; see
|
|
597
|
+
claude-coordinator#2553, ``coord-portal``#129 assignment
|
|
598
|
+
``c2120f7206ec``). The branch is the one artifact in this whole path
|
|
599
|
+
that survives an agent restart, a machine reboot, and the 25-entry
|
|
600
|
+
completion-history cap, and the board row already names it — so this now
|
|
601
|
+
asks it directly via ``commits_ahead_fn(a, config)`` before choosing:
|
|
602
|
+
|
|
603
|
+
* Only for :data:`~coord.models.WORK_LIKE_TYPES` (``work``,
|
|
604
|
+
``mock-author``, ``test-author``) — the types whose ``a.branch`` holds
|
|
605
|
+
commits THIS row itself produced. A ``smoke``/``review`` row's
|
|
606
|
+
``branch`` is inherited verbatim from the work it rides on (e.g.
|
|
607
|
+
``coord.smoke.dispatch_pending_smoke`` stamps
|
|
608
|
+
``branch=completed.branch``), so "commits ahead of base" there would
|
|
609
|
+
just be re-discovering the PARENT's diff, not anything this leg
|
|
610
|
+
produced — checking it would misfire the #2208 smoke path (a dead Test
|
|
611
|
+
leg on an already-green branch) into ``advisory`` instead of the
|
|
612
|
+
environmental clear it needs.
|
|
613
|
+
* A positive, known commit count (``ahead`` a plain ``int > 0``) is the
|
|
614
|
+
only thing that moves the needle, to ``advisory`` with
|
|
615
|
+
:func:`_no_agent_record_branch_reason` (which names the branch).
|
|
616
|
+
Anything else — no branch, a non-``WORK_LIKE_TYPES`` row, ``ahead ==
|
|
617
|
+
0``, or ``ahead is None`` (unknown: the repo isn't in ``config``, the
|
|
618
|
+
remote call failed, ...) — keeps the pre-#2553 behaviour: ``failed``
|
|
619
|
+
with :data:`NO_AGENT_RECORD_REASON`. Unknown fails CLOSED toward
|
|
620
|
+
``failed`` rather than guessing ``advisory``, matching this arm's
|
|
621
|
+
existing polarity: a stall is recoverable, a manufactured verdict of
|
|
622
|
+
either kind is not the thing to guess at.
|
|
623
|
+
* ``commits_ahead_fn`` is called defensively — a network hiccup querying
|
|
624
|
+
the remote must not crash the passive daemon tick any more than an
|
|
625
|
+
unreachable agent does elsewhere in this module.
|
|
626
|
+
|
|
627
|
+
``exit_code`` is deliberately left ``None`` in both cases: there is no
|
|
628
|
+
reap, so there is no exit code, and writing a fake one would be the same
|
|
629
|
+
class of lie as writing ``done``.
|
|
543
630
|
|
|
544
631
|
Kept passive, per this module's #1616 contract — it writes state through
|
|
545
|
-
the same ``update_state_fn`` seam and dispatches nothing. The
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
632
|
+
the same ``update_state_fn`` seam and dispatches nothing. The commits-
|
|
633
|
+
ahead check is a read, not a mutation, and it decides between two
|
|
634
|
+
non-dispatching terminal states — it does not advance the pipeline any
|
|
635
|
+
more than the write itself does. The #1605 Test-stage propagation below
|
|
636
|
+
is not a new side effect either: it is the same call the ordinary
|
|
637
|
+
``terminal == "failed"`` path already makes, and skipping it would leave
|
|
638
|
+
the parent work row's ``test_state="running"`` forever — i.e. it would
|
|
639
|
+
fix half of #2208 and leave the other half stranded.
|
|
551
640
|
"""
|
|
641
|
+
terminal_status = "failed"
|
|
642
|
+
reason = NO_AGENT_RECORD_REASON
|
|
643
|
+
branch = (a.branch or "").strip()
|
|
644
|
+
|
|
645
|
+
if branch and a.type in WORK_LIKE_TYPES:
|
|
646
|
+
try:
|
|
647
|
+
ahead = commits_ahead_fn(a, config)
|
|
648
|
+
except Exception: # noqa: BLE001 — best-effort; unknown → failed below
|
|
649
|
+
ahead = None
|
|
650
|
+
if isinstance(ahead, int) and not isinstance(ahead, bool) and ahead > 0:
|
|
651
|
+
terminal_status = "advisory"
|
|
652
|
+
reason = _no_agent_record_branch_reason(branch, ahead)
|
|
653
|
+
|
|
552
654
|
update_state_fn(
|
|
553
655
|
assignment_id=aid,
|
|
554
|
-
terminal_status=
|
|
656
|
+
terminal_status=terminal_status,
|
|
555
657
|
branch=a.branch,
|
|
556
658
|
review_state=None,
|
|
557
|
-
failure_reason=
|
|
659
|
+
failure_reason=reason,
|
|
558
660
|
exit_code=None,
|
|
559
661
|
)
|
|
560
662
|
|
|
561
|
-
if a.type == "smoke":
|
|
663
|
+
if a.type == "smoke" and terminal_status == "failed":
|
|
562
664
|
# #2275: environmental by construction, so state it rather than
|
|
563
665
|
# letting `classify_failure` guess. `NO_AGENT_RECORD_REASON` is
|
|
564
666
|
# coordinator-authored prose with no wire token in it, so the
|
|
@@ -569,9 +671,12 @@ def _reconcile_no_agent_record(
|
|
|
569
671
|
# vanished worker is the machine's fault, not the work's; clearing
|
|
570
672
|
# the verdict lets `dispatch_pending_smoke` re-run the Test stage on
|
|
571
673
|
# its next tick, which is exactly what a human did in 14 minutes.
|
|
674
|
+
# (`terminal_status` is always "failed" for `smoke` in practice — the
|
|
675
|
+
# branch check above only ever fires for WORK_LIKE_TYPES — but the
|
|
676
|
+
# guard keeps this correct even if that scoping ever changes.)
|
|
572
677
|
propagate_smoke_terminal_failure(
|
|
573
678
|
parent_assignment_id=a.review_of_assignment_id,
|
|
574
|
-
failure_reason=
|
|
679
|
+
failure_reason=reason,
|
|
575
680
|
environmental=True,
|
|
576
681
|
)
|
|
577
682
|
|
|
@@ -581,9 +686,9 @@ def _reconcile_no_agent_record(
|
|
|
581
686
|
"issue_number": a.issue_number,
|
|
582
687
|
"repo": a.repo_name,
|
|
583
688
|
"type": a.type,
|
|
584
|
-
"to_status":
|
|
689
|
+
"to_status": terminal_status,
|
|
585
690
|
"plan_captured": False,
|
|
586
|
-
"reason":
|
|
691
|
+
"reason": reason,
|
|
587
692
|
}
|
|
588
693
|
)
|
|
589
694
|
|
|
@@ -247,6 +247,7 @@ def build_test_author_briefing(
|
|
|
247
247
|
issue_body: str | None,
|
|
248
248
|
driver_entrypoint: str = "",
|
|
249
249
|
driver_mock: str = "",
|
|
250
|
+
default_branch: str = "main",
|
|
250
251
|
) -> str:
|
|
251
252
|
"""Compose the test-author's briefing (its first/only user message).
|
|
252
253
|
|
|
@@ -255,6 +256,16 @@ def build_test_author_briefing(
|
|
|
255
256
|
None) authors the full initial suite from the contract; *JIT mode*
|
|
256
257
|
(`issue_number` set) extends just that issue's slice.
|
|
257
258
|
|
|
259
|
+
*default_branch* (#2539) is the repo's merge target (``repo_cfg.
|
|
260
|
+
default_branch or "main"`` at both call sites, the same value already
|
|
261
|
+
sent as the dispatch payload's ``branch`` field). JIT mode uses it to
|
|
262
|
+
tell the author to check this branch's mergeability before finishing —
|
|
263
|
+
a re-dispatch onto an already-authored slice branch (see the #2552
|
|
264
|
+
RESUMING note appended by `dispatch_test_author`) previously had no
|
|
265
|
+
instruction to look at `default_branch` at all, so a slice that had
|
|
266
|
+
gone stale behind a sibling slice's merge would report done with an
|
|
267
|
+
unresolved conflict still sitting on the PR (coord-portal#132).
|
|
268
|
+
|
|
258
269
|
*driver_entrypoint* (#1552) is the driver's declared ``entrypoint:`` —
|
|
259
270
|
the crate root a slice must be registered in before the run command can
|
|
260
271
|
see it, for a framework that links tests through an entry point rather
|
|
@@ -346,6 +357,43 @@ def build_test_author_briefing(
|
|
|
346
357
|
parts.append("")
|
|
347
358
|
parts.append(f"ISSUE #{issue_number}: {issue_title or '(no title)'}")
|
|
348
359
|
parts.append(issue_body.strip() if issue_body and issue_body.strip() else "(no body)")
|
|
360
|
+
parts.append("")
|
|
361
|
+
parts.append(
|
|
362
|
+
f"MERGEABILITY (#2539): before you finish — after step 4b's "
|
|
363
|
+
f"manifest update, before step 6's commit/push — fetch "
|
|
364
|
+
f"`{default_branch}` (`git fetch origin {default_branch}`) and "
|
|
365
|
+
f"check whether this branch still merges onto it cleanly (e.g. "
|
|
366
|
+
f"`git merge --no-commit --no-ff origin/{default_branch}`, then "
|
|
367
|
+
"`git merge --abort` once you've seen the result — never leave "
|
|
368
|
+
"the worktree mid-merge). This branch may already carry commits "
|
|
369
|
+
"from a prior dispatch (see any note above about resuming "
|
|
370
|
+
"unfinished work), and a sibling slice's PR may have merged "
|
|
371
|
+
f"into `{default_branch}` since this one was authored. If it "
|
|
372
|
+
"merges clean, proceed to commit/push as normal. If it "
|
|
373
|
+
"conflicts:\n"
|
|
374
|
+
f" - Confined to `{ACCEPTANCE_DIRNAME}/{ms_dir}/**` (the sealed "
|
|
375
|
+
"suite YOU already have authoring rights over) AND a clean "
|
|
376
|
+
"additive collision — the common case is two slices each "
|
|
377
|
+
"appending their own block to the shared "
|
|
378
|
+
"`manifest.(yml|json)` (that file documents its own "
|
|
379
|
+
"convention: later slices MERGE into it) — resolve it "
|
|
380
|
+
f"yourself: rebase onto `origin/{default_branch}` and keep BOTH "
|
|
381
|
+
"sides' additions, never dropping the other slice's entries to "
|
|
382
|
+
"make yours resolve. Re-run step 4's red-check afterward — a "
|
|
383
|
+
"rebase can shift what the tests see underneath them.\n"
|
|
384
|
+
" - Anything else — a conflict that reaches outside "
|
|
385
|
+
f"`{ACCEPTANCE_DIRNAME}/{ms_dir}/**`, or isn't a clean additive "
|
|
386
|
+
"collision — do NOT guess a resolution. Abort the merge/rebase, "
|
|
387
|
+
"leave the branch as it was, and STOP with:\n"
|
|
388
|
+
f" STUCK: merge conflict against {default_branch} in "
|
|
389
|
+
"<file(s)> — outside sealed-authoring scope or not a clean "
|
|
390
|
+
"additive merge\n"
|
|
391
|
+
"(same posture a `conflict-fix` session takes for a "
|
|
392
|
+
"non-rebaseable conflict — you are simply the only dispatch "
|
|
393
|
+
f"type structurally allowed to touch `{ACCEPTANCE_DIRNAME}/` "
|
|
394
|
+
"at all, so a conflict confined there is yours to resolve, not "
|
|
395
|
+
"conflict-fix's)."
|
|
396
|
+
)
|
|
349
397
|
|
|
350
398
|
parts.append("")
|
|
351
399
|
parts.append("---")
|
|
@@ -499,6 +547,7 @@ def dispatch_test_author(
|
|
|
499
547
|
issue_number=issue_number,
|
|
500
548
|
issue_title=issue_title,
|
|
501
549
|
issue_body=issue_body,
|
|
550
|
+
default_branch=repo_cfg.default_branch or "main",
|
|
502
551
|
)
|
|
503
552
|
|
|
504
553
|
# #1171: milestone-mode dispatches (issue_number is None) keep a single
|
|
@@ -889,6 +938,7 @@ def dispatch_test_author_interactive(
|
|
|
889
938
|
issue_number=issue_number,
|
|
890
939
|
issue_title=issue_title,
|
|
891
940
|
issue_body=issue_body,
|
|
941
|
+
default_branch=repo_cfg.default_branch or "main",
|
|
892
942
|
)
|
|
893
943
|
|
|
894
944
|
# Same FIXED title as the headless dispatch (see dispatch_test_author's
|
|
@@ -2557,6 +2557,12 @@ def test_a_dead_end_exit_code_reaches_the_drive_exited_audit_row(
|
|
|
2557
2557
|
monkeypatch.setattr(
|
|
2558
2558
|
"coord.drive.Driver._post_escalation_comment", lambda *a, **kw: None
|
|
2559
2559
|
)
|
|
2560
|
+
# Pin `coord_argv()`'s prefix to a single element so the `c[1:3]` slice
|
|
2561
|
+
# below is decided by the code under test, not by whether `coord` is on
|
|
2562
|
+
# the *host's* $PATH (#2564) — off-PATH, `coord_argv()`'s documented
|
|
2563
|
+
# fallback is `[sys.executable, "-m", "coord.cli"]`, three elements, which
|
|
2564
|
+
# shifts every recorded argv's ["escalate", "record"] out of [1:3].
|
|
2565
|
+
monkeypatch.setenv("COORD_DRIVE_COORD_BIN", "coord")
|
|
2560
2566
|
payload = board(status="done", test_state="passed")
|
|
2561
2567
|
payload["assignments"].append({
|
|
2562
2568
|
"repo_name": REPO,
|
{code_coordinator-0.5.225 → code_coordinator-0.5.227}/tests/test_reconcile_no_agent_record.py
RENAMED
|
@@ -23,6 +23,8 @@ import subprocess
|
|
|
23
23
|
import time
|
|
24
24
|
from pathlib import Path
|
|
25
25
|
|
|
26
|
+
import pytest
|
|
27
|
+
|
|
26
28
|
from coord.config import Config
|
|
27
29
|
from coord.models import Assignment, Board, Machine, Repo
|
|
28
30
|
from coord.reconcile import (
|
|
@@ -33,6 +35,26 @@ from coord.reconcile import (
|
|
|
33
35
|
)
|
|
34
36
|
|
|
35
37
|
|
|
38
|
+
@pytest.fixture(autouse=True)
|
|
39
|
+
def _no_real_gh_calls(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
40
|
+
"""Safety net for #2553's branch check: every test in this module either
|
|
41
|
+
doesn't reach `_reconcile_no_agent_record`'s branch check at all, or
|
|
42
|
+
passes its own `commits_ahead_fn` stub. If a future test reaches it
|
|
43
|
+
without stubbing, this fails loudly instead of silently shelling out to
|
|
44
|
+
a real `gh` for a repo (`acme/cc`) that doesn't exist."""
|
|
45
|
+
|
|
46
|
+
def _boom(*_a, **_kw): # pragma: no cover - only runs on regression
|
|
47
|
+
raise AssertionError(
|
|
48
|
+
"a test reached the real github_ops.branch_commits_ahead_for_"
|
|
49
|
+
"assignment default — pass commits_ahead_fn= explicitly instead "
|
|
50
|
+
"of hitting the network from a unit test"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
monkeypatch.setattr(
|
|
54
|
+
"coord.github_ops.branch_commits_ahead_for_assignment", _boom
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
36
58
|
def _config() -> Config:
|
|
37
59
|
return Config(
|
|
38
60
|
repos=[Repo(name="cc", github="acme/cc")],
|
|
@@ -97,6 +119,14 @@ def _status(*, active: list[dict] | None = None, completed: list[dict] | None =
|
|
|
97
119
|
return {"active": list(active or []), "completed": list(completed or [])}
|
|
98
120
|
|
|
99
121
|
|
|
122
|
+
def _zero_ahead(*_a, **_kw) -> int:
|
|
123
|
+
"""Stub `commits_ahead_fn` (#2553): "nothing pushed" — the pre-#2553
|
|
124
|
+
default. Passed explicitly by every test below that doesn't itself
|
|
125
|
+
exercise the branch-has-work half, so the no-record arm never shells out
|
|
126
|
+
to a real `gh` for a repo (`acme/cc`) that doesn't exist."""
|
|
127
|
+
return 0
|
|
128
|
+
|
|
129
|
+
|
|
100
130
|
# ── the fix ────────────────────────────────────────────────────────────────
|
|
101
131
|
|
|
102
132
|
|
|
@@ -113,6 +143,7 @@ def test_row_in_neither_list_is_reconciled_to_failed_with_pinned_reason() -> Non
|
|
|
113
143
|
),
|
|
114
144
|
update_state_fn=rec,
|
|
115
145
|
capture_plan=False,
|
|
146
|
+
commits_ahead_fn=_zero_ahead,
|
|
116
147
|
)
|
|
117
148
|
|
|
118
149
|
assert len(rec.calls) == 1
|
|
@@ -158,6 +189,7 @@ def test_never_flips_to_done() -> None:
|
|
|
158
189
|
agent_status_fn=lambda host: _status(),
|
|
159
190
|
update_state_fn=rec,
|
|
160
191
|
capture_plan=False,
|
|
192
|
+
commits_ahead_fn=_zero_ahead,
|
|
161
193
|
)
|
|
162
194
|
assert [c["terminal_status"] for c in rec.calls] == ["failed", "failed", "failed"]
|
|
163
195
|
|
|
@@ -176,6 +208,7 @@ def test_empty_agent_reconciles_every_row_on_that_machine() -> None:
|
|
|
176
208
|
agent_status_fn=lambda host: _status(),
|
|
177
209
|
update_state_fn=rec,
|
|
178
210
|
capture_plan=False,
|
|
211
|
+
commits_ahead_fn=_zero_ahead,
|
|
179
212
|
)
|
|
180
213
|
assert {c["assignment_id"] for c in rec.calls} == {"a1", "a2", "a3"}
|
|
181
214
|
assert len(out) == 3
|
|
@@ -210,6 +243,147 @@ def test_restart_recovered_row_takes_the_ordinary_path_not_the_no_record_arm() -
|
|
|
210
243
|
assert rec.calls[0]["exit_code"] == 1
|
|
211
244
|
|
|
212
245
|
|
|
246
|
+
# ── #2553: consult the row's own branch before guessing `failed` ───────────
|
|
247
|
+
#
|
|
248
|
+
# coord-portal#129, assignment c2120f7206ec: a `test-author` leg pushed 948
|
|
249
|
+
# lines to `test-author-ms-4-slice-129` and then the agent forgot about it.
|
|
250
|
+
# The no-record arm recorded `failed` without ever looking at the branch it
|
|
251
|
+
# was already holding the name of, stranding real work behind a sealed path
|
|
252
|
+
# nothing else would ever pick back up.
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def test_branch_with_pushed_commits_is_advisory_not_failed() -> None:
|
|
256
|
+
"""Acceptance half 1: agent forgot, but the branch has commits ahead of
|
|
257
|
+
its base → `advisory`, not `failed` — the work must not be discarded."""
|
|
258
|
+
rec = _Recorder()
|
|
259
|
+
out = reconcile_completed_assignments(
|
|
260
|
+
_config(),
|
|
261
|
+
board=_board(_running("ta1", atype="test-author", branch="test-author-ms-4-slice-129")),
|
|
262
|
+
agent_status_fn=lambda host: _status(),
|
|
263
|
+
update_state_fn=rec,
|
|
264
|
+
capture_plan=False,
|
|
265
|
+
commits_ahead_fn=lambda a, cfg: 11,
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
assert len(rec.calls) == 1
|
|
269
|
+
assert rec.calls[0]["terminal_status"] == "advisory"
|
|
270
|
+
assert rec.calls[0]["branch"] == "test-author-ms-4-slice-129"
|
|
271
|
+
assert rec.calls[0]["exit_code"] is None
|
|
272
|
+
reason = rec.calls[0]["failure_reason"]
|
|
273
|
+
assert reason != NO_AGENT_RECORD_REASON
|
|
274
|
+
# The operator-facing reason must name the branch — that's the whole
|
|
275
|
+
# acceptance bar: an operator reading `coord status` shouldn't have to
|
|
276
|
+
# go spelunking for which branch carries the stranded work.
|
|
277
|
+
assert "test-author-ms-4-slice-129" in reason
|
|
278
|
+
assert "11" in reason
|
|
279
|
+
assert "#2553" in reason
|
|
280
|
+
assert out[0]["to_status"] == "advisory"
|
|
281
|
+
assert out[0]["reason"] == reason
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def test_branch_with_zero_commits_ahead_is_still_failed() -> None:
|
|
285
|
+
"""Acceptance half 2: agent forgot, and nothing was ever pushed → the
|
|
286
|
+
pre-#2553 `failed` + pinned reason, unchanged."""
|
|
287
|
+
rec = _Recorder()
|
|
288
|
+
out = reconcile_completed_assignments(
|
|
289
|
+
_config(),
|
|
290
|
+
board=_board(_running("w1", atype="work")),
|
|
291
|
+
agent_status_fn=lambda host: _status(),
|
|
292
|
+
update_state_fn=rec,
|
|
293
|
+
capture_plan=False,
|
|
294
|
+
commits_ahead_fn=lambda a, cfg: 0,
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
assert rec.calls[0]["terminal_status"] == "failed"
|
|
298
|
+
assert rec.calls[0]["failure_reason"] == NO_AGENT_RECORD_REASON
|
|
299
|
+
assert out[0]["to_status"] == "failed"
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def test_unknown_commits_ahead_fails_closed_to_failed() -> None:
|
|
303
|
+
"""An unconfirmable branch state (network hiccup, unknown repo, ...)
|
|
304
|
+
must not be guessed as `advisory` — that would be manufacturing a
|
|
305
|
+
"provenance unverified" verdict on no evidence at all. Fails closed to
|
|
306
|
+
the pre-#2553 `failed`, matching this arm's existing polarity."""
|
|
307
|
+
rec = _Recorder()
|
|
308
|
+
reconcile_completed_assignments(
|
|
309
|
+
_config(),
|
|
310
|
+
board=_board(_running("w1", atype="work")),
|
|
311
|
+
agent_status_fn=lambda host: _status(),
|
|
312
|
+
update_state_fn=rec,
|
|
313
|
+
capture_plan=False,
|
|
314
|
+
commits_ahead_fn=lambda a, cfg: None,
|
|
315
|
+
)
|
|
316
|
+
assert rec.calls[0]["terminal_status"] == "failed"
|
|
317
|
+
assert rec.calls[0]["failure_reason"] == NO_AGENT_RECORD_REASON
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def test_commits_ahead_fn_raising_fails_closed_to_failed() -> None:
|
|
321
|
+
"""A network error from the branch check must not crash the passive
|
|
322
|
+
daemon tick — caught and treated as unknown, same as a `None` return."""
|
|
323
|
+
rec = _Recorder()
|
|
324
|
+
reconcile_completed_assignments(
|
|
325
|
+
_config(),
|
|
326
|
+
board=_board(_running("w1", atype="work")),
|
|
327
|
+
agent_status_fn=lambda host: _status(),
|
|
328
|
+
update_state_fn=rec,
|
|
329
|
+
capture_plan=False,
|
|
330
|
+
commits_ahead_fn=lambda a, cfg: (_ for _ in ()).throw(RuntimeError("boom")),
|
|
331
|
+
)
|
|
332
|
+
assert rec.calls[0]["terminal_status"] == "failed"
|
|
333
|
+
assert rec.calls[0]["failure_reason"] == NO_AGENT_RECORD_REASON
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def test_branch_check_is_scoped_to_work_like_types() -> None:
|
|
337
|
+
"""A `smoke`/`review` row's `branch` is inherited verbatim from the work
|
|
338
|
+
it rides on (see `coord.smoke.dispatch_pending_smoke`), so it is almost
|
|
339
|
+
always "ahead" for reasons that have nothing to do with what THIS leg
|
|
340
|
+
produced. The branch check must not run for these types — checked here
|
|
341
|
+
by making the stub explode if it's ever called for a non-WORK_LIKE_TYPES
|
|
342
|
+
row, which would otherwise misroute the #2208 smoke path into
|
|
343
|
+
`advisory` instead of its environmental `failed` clear."""
|
|
344
|
+
|
|
345
|
+
def _boom(a, cfg): # pragma: no cover - only runs on regression
|
|
346
|
+
raise AssertionError(
|
|
347
|
+
f"commits_ahead_fn was called for a.type={a.type!r}, which is "
|
|
348
|
+
"not in WORK_LIKE_TYPES"
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
rec = _Recorder()
|
|
352
|
+
out = reconcile_completed_assignments(
|
|
353
|
+
_config(),
|
|
354
|
+
board=_board(
|
|
355
|
+
_running("smoke-1", atype="smoke", review_of="work-1"),
|
|
356
|
+
_running("review-1", atype="review"),
|
|
357
|
+
),
|
|
358
|
+
agent_status_fn=lambda host: _status(),
|
|
359
|
+
update_state_fn=rec,
|
|
360
|
+
capture_plan=False,
|
|
361
|
+
commits_ahead_fn=_boom,
|
|
362
|
+
)
|
|
363
|
+
assert [c["terminal_status"] for c in rec.calls] == ["failed", "failed"]
|
|
364
|
+
assert [o["to_status"] for o in out] == ["failed", "failed"]
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
def test_no_branch_recorded_is_still_failed() -> None:
|
|
368
|
+
"""A row with no branch at all has nothing to consult — straight to the
|
|
369
|
+
pre-#2553 `failed` path without ever calling `commits_ahead_fn`."""
|
|
370
|
+
|
|
371
|
+
def _boom(a, cfg): # pragma: no cover - only runs on regression
|
|
372
|
+
raise AssertionError("commits_ahead_fn was called with no branch")
|
|
373
|
+
|
|
374
|
+
rec = _Recorder()
|
|
375
|
+
reconcile_completed_assignments(
|
|
376
|
+
_config(),
|
|
377
|
+
board=_board(_running("w1", atype="work", branch=None)),
|
|
378
|
+
agent_status_fn=lambda host: _status(),
|
|
379
|
+
update_state_fn=rec,
|
|
380
|
+
capture_plan=False,
|
|
381
|
+
commits_ahead_fn=_boom,
|
|
382
|
+
)
|
|
383
|
+
assert rec.calls[0]["terminal_status"] == "failed"
|
|
384
|
+
assert rec.calls[0]["failure_reason"] == NO_AGENT_RECORD_REASON
|
|
385
|
+
|
|
386
|
+
|
|
213
387
|
# ── guard rails ────────────────────────────────────────────────────────────
|
|
214
388
|
|
|
215
389
|
|
|
@@ -316,6 +490,7 @@ def test_grace_window_defers_a_just_dispatched_row() -> None:
|
|
|
316
490
|
agent_status_fn=lambda host: _status(),
|
|
317
491
|
update_state_fn=rec,
|
|
318
492
|
capture_plan=False,
|
|
493
|
+
commits_ahead_fn=_zero_ahead,
|
|
319
494
|
)
|
|
320
495
|
assert rec.calls == []
|
|
321
496
|
assert out == []
|
|
@@ -328,6 +503,7 @@ def test_grace_window_defers_a_just_dispatched_row() -> None:
|
|
|
328
503
|
agent_status_fn=lambda host: _status(),
|
|
329
504
|
update_state_fn=rec2,
|
|
330
505
|
capture_plan=False,
|
|
506
|
+
commits_ahead_fn=_zero_ahead,
|
|
331
507
|
)
|
|
332
508
|
assert [c["assignment_id"] for c in rec2.calls] == ["fresh"]
|
|
333
509
|
|
|
@@ -342,6 +518,7 @@ def test_row_with_no_dispatched_at_is_eligible() -> None:
|
|
|
342
518
|
agent_status_fn=lambda host: _status(),
|
|
343
519
|
update_state_fn=rec,
|
|
344
520
|
capture_plan=False,
|
|
521
|
+
commits_ahead_fn=_zero_ahead,
|
|
345
522
|
)
|
|
346
523
|
assert [c["assignment_id"] for c in rec.calls] == ["nodate"]
|
|
347
524
|
|
|
@@ -359,7 +536,13 @@ def test_agent_has_no_record_predicate() -> None:
|
|
|
359
536
|
|
|
360
537
|
def test_arm_stays_passive_no_dispatch_no_github(monkeypatch) -> None:
|
|
361
538
|
"""#1616's contract: this function reflects state, it never advances the
|
|
362
|
-
pipeline. The no-record arm must not become the exception.
|
|
539
|
+
pipeline. The no-record arm must not become the exception.
|
|
540
|
+
|
|
541
|
+
#2553's branch check is a READ (`commits_ahead_fn`), not a mutation, and
|
|
542
|
+
it only decides between two non-dispatching terminal statuses — it does
|
|
543
|
+
not violate this contract, so it is stubbed here (like `agent_status_fn`
|
|
544
|
+
always has been) rather than asserted against. What must still never
|
|
545
|
+
happen is a dispatch (`_reassign`) or a posted comment (`httpx.post`)."""
|
|
363
546
|
import coord.reconcile as rec_mod
|
|
364
547
|
|
|
365
548
|
def _boom(*a, **kw): # pragma: no cover - only runs on regression
|
|
@@ -375,6 +558,7 @@ def test_arm_stays_passive_no_dispatch_no_github(monkeypatch) -> None:
|
|
|
375
558
|
agent_status_fn=lambda host: _status(),
|
|
376
559
|
update_state_fn=rec,
|
|
377
560
|
capture_plan=False,
|
|
561
|
+
commits_ahead_fn=_zero_ahead,
|
|
378
562
|
)
|
|
379
563
|
assert rec.calls[0]["terminal_status"] == "failed"
|
|
380
564
|
|
|
@@ -526,6 +710,7 @@ def test_history_eviction_end_to_end(tmp_path: Path) -> None:
|
|
|
526
710
|
agent_status_fn=lambda host: payload,
|
|
527
711
|
update_state_fn=rec,
|
|
528
712
|
capture_plan=False,
|
|
713
|
+
commits_ahead_fn=_zero_ahead,
|
|
529
714
|
)
|
|
530
715
|
server.shutdown()
|
|
531
716
|
|