code-coordinator 0.5.224__tar.gz → 0.5.226__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.224 → code_coordinator-0.5.226}/PKG-INFO +1 -1
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/confirm_test.py +67 -2
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notify.py +34 -3
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/reconcile.py +134 -29
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_confirm_test.py +129 -3
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_drive.py +6 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notify.py +1 -1
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_reconcile_no_agent_record.py +186 -1
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/.gitignore +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/CLAUDE.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/GOAL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/LICENSE +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/MANIFEST.in +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/README.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/__init__.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/agent.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/audit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/block_log.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/board_service.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/brain.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/claim.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/cli.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/client.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/comments.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/config.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/dao.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/db.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/deps.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/drive.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/events.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/filelock.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/freshness.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/gates.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/goal.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/context.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/models.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/render.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/health/units.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/hooks.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/interactive.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/models.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/network.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/openapi.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/parentage.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/plans.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/progress.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/release_window.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/reports.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/review.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/self_health.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/smoke.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/split_work.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/state.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/test_author.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/test_report.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/usage.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/install-agent.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/pyproject.toml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/setup.cfg +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/__init__.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/conftest.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_config.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_db.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_events.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_init.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_models.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_network.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_review.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_session.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_split.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_state.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.224 → code_coordinator-0.5.226}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -333,6 +333,45 @@ class ConfirmationResult:
|
|
|
333
333
|
return self.kind in INCONCLUSIVE_KINDS
|
|
334
334
|
|
|
335
335
|
|
|
336
|
+
def write_confirmation_output(assignment_id: str, result: ConfirmationResult) -> Path | None:
|
|
337
|
+
"""Persist a confirmation run's captured output tail for the fix briefing (#2563).
|
|
338
|
+
|
|
339
|
+
``coord fix`` (:mod:`coord.commands.plan_followup`) already prefers
|
|
340
|
+
``COORD_DIR/test_output/<assignment_id>.txt`` over every other evidence
|
|
341
|
+
source when it composes an escalated fix worker's briefing — `coord test
|
|
342
|
+
--fail --output` (:mod:`coord.commands.test_gate`) has written it there
|
|
343
|
+
since #1337. Before this function existed, a #2464 refutation captured
|
|
344
|
+
``result.output`` (already bounded to a tail by :func:`_tail` in
|
|
345
|
+
:func:`_classify_failure` / :func:`_timeout_output`) and then only ever
|
|
346
|
+
handed it to ``log.warning`` — the fix worker got a one-line reason and no
|
|
347
|
+
failing test names, no tracebacks, and had to re-derive the diagnosis the
|
|
348
|
+
daemon already held in memory.
|
|
349
|
+
|
|
350
|
+
*assignment_id* is the parent **work** row's id (the one the fix leg is
|
|
351
|
+
spawned from), not the confirming smoke transition's id — same key
|
|
352
|
+
:func:`coord.commands.plan_followup.fix` reads back by.
|
|
353
|
+
|
|
354
|
+
A no-op, returning ``None``, when there is nothing to write (``KIND_OK``
|
|
355
|
+
and ``KIND_SETUP`` both carry an empty ``.output`` — the former because
|
|
356
|
+
nothing failed, the latter because no command ever ran) or when the write
|
|
357
|
+
itself fails (a read-only ``COORD_DIR``, a full disk, ...); this must
|
|
358
|
+
never break verdict recording, which is why the caller in
|
|
359
|
+
:mod:`coord.notify` treats it as best-effort.
|
|
360
|
+
"""
|
|
361
|
+
if not result.output:
|
|
362
|
+
return None
|
|
363
|
+
from coord.state import COORD_DIR # noqa: PLC0415
|
|
364
|
+
|
|
365
|
+
try:
|
|
366
|
+
test_output_dir = COORD_DIR / "test_output"
|
|
367
|
+
test_output_dir.mkdir(parents=True, exist_ok=True)
|
|
368
|
+
stored = test_output_dir / f"{assignment_id}.txt"
|
|
369
|
+
stored.write_text(result.output)
|
|
370
|
+
except OSError:
|
|
371
|
+
return None
|
|
372
|
+
return stored
|
|
373
|
+
|
|
374
|
+
|
|
336
375
|
def confirmation_enabled(config=None) -> bool:
|
|
337
376
|
"""Whether Test-stage PASS claims get independently confirmed.
|
|
338
377
|
|
|
@@ -488,6 +527,29 @@ def unmet_confirmation_capabilities(
|
|
|
488
527
|
return [cap for cap in match_rules(touched, rules) if cap not in have]
|
|
489
528
|
|
|
490
529
|
|
|
530
|
+
def _timeout_output(exc: subprocess.TimeoutExpired) -> str:
|
|
531
|
+
"""Partial stdout/stderr captured before a confirmation command timed out.
|
|
532
|
+
|
|
533
|
+
``subprocess.run(..., capture_output=True, timeout=...)`` fills ``.stdout``
|
|
534
|
+
/ ``.stderr`` in on `TimeoutExpired` — the child had already written
|
|
535
|
+
*something* by the deadline — but the two `except subprocess.TimeoutExpired`
|
|
536
|
+
arms in :func:`confirm_branch` discarded it entirely, so a TIMEOUT verdict
|
|
537
|
+
carried strictly less evidence than BASELINE_RED/SIGNAL did even though the
|
|
538
|
+
same partial output was sitting right there on the exception (#2563).
|
|
539
|
+
Guards for ``None``/bytes since a test's stand-in *runner* seam may raise a
|
|
540
|
+
bare ``TimeoutExpired(cmd, timeout)`` with neither attribute set.
|
|
541
|
+
"""
|
|
542
|
+
out = getattr(exc, "stdout", None) or ""
|
|
543
|
+
err = getattr(exc, "stderr", None) or ""
|
|
544
|
+
if isinstance(out, bytes):
|
|
545
|
+
out = out.decode("utf-8", errors="replace")
|
|
546
|
+
if isinstance(err, bytes):
|
|
547
|
+
err = err.decode("utf-8", errors="replace")
|
|
548
|
+
if not out and not err:
|
|
549
|
+
return ""
|
|
550
|
+
return _tail(out + "\n" + err)
|
|
551
|
+
|
|
552
|
+
|
|
491
553
|
def _classify_failure(
|
|
492
554
|
stage: str, returncode: int, output: str, worktree: Path, command: str,
|
|
493
555
|
) -> ConfirmationResult:
|
|
@@ -741,7 +803,7 @@ def confirm_branch(
|
|
|
741
803
|
echo(f" confirming build: {build_command}")
|
|
742
804
|
try:
|
|
743
805
|
built = run_cmd(build_command, wt_path, _left())
|
|
744
|
-
except subprocess.TimeoutExpired:
|
|
806
|
+
except subprocess.TimeoutExpired as exc:
|
|
745
807
|
return ConfirmationResult(
|
|
746
808
|
kind=KIND_TIMEOUT,
|
|
747
809
|
reason=(
|
|
@@ -749,6 +811,7 @@ def confirm_branch(
|
|
|
749
811
|
"suite that did not finish says nothing about the "
|
|
750
812
|
"branch"
|
|
751
813
|
),
|
|
814
|
+
output=_timeout_output(exc),
|
|
752
815
|
command=build_command,
|
|
753
816
|
worktree=wt_path,
|
|
754
817
|
)
|
|
@@ -780,13 +843,14 @@ def confirm_branch(
|
|
|
780
843
|
echo(f" confirming tests: {test_command}")
|
|
781
844
|
try:
|
|
782
845
|
tested = run_cmd(test_command, wt_path, _left())
|
|
783
|
-
except subprocess.TimeoutExpired:
|
|
846
|
+
except subprocess.TimeoutExpired as exc:
|
|
784
847
|
return ConfirmationResult(
|
|
785
848
|
kind=KIND_TIMEOUT,
|
|
786
849
|
reason=(
|
|
787
850
|
f"confirmation suite timed out after {timeout}s — a "
|
|
788
851
|
"suite that did not finish says nothing about the branch"
|
|
789
852
|
),
|
|
853
|
+
output=_timeout_output(exc),
|
|
790
854
|
command=test_command,
|
|
791
855
|
worktree=wt_path,
|
|
792
856
|
)
|
|
@@ -835,4 +899,5 @@ __all__ = [
|
|
|
835
899
|
"notify_client_timeout_seconds",
|
|
836
900
|
"spend_confirmation_budget",
|
|
837
901
|
"unmet_confirmation_capabilities",
|
|
902
|
+
"write_confirmation_output",
|
|
838
903
|
]
|
|
@@ -2011,7 +2011,7 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
|
|
|
2011
2011
|
|
|
2012
2012
|
|
|
2013
2013
|
def _confirmed_pass_verdict(
|
|
2014
|
-
transition: Transition, entry: dict, *, claim_reason: str,
|
|
2014
|
+
transition: Transition, entry: dict, parent_id: str, *, claim_reason: str,
|
|
2015
2015
|
) -> tuple[str, str]:
|
|
2016
2016
|
"""#2464: the ``(test_state, test_reason)`` to record for a *claimed* pass.
|
|
2017
2017
|
|
|
@@ -2033,7 +2033,19 @@ def _confirmed_pass_verdict(
|
|
|
2033
2033
|
#2464, with ``UNCONFIRMED`` in the reason so the row says plainly that
|
|
2034
2034
|
nobody checked. See :mod:`coord.confirm_test` on why a missing toolchain,
|
|
2035
2035
|
a missing checkout or a timeout must never read as a failing branch.
|
|
2036
|
+
|
|
2037
|
+
#2563: whatever output the run captured — failing node ids, the
|
|
2038
|
+
assertion, tracebacks — is also persisted to *parent_id*'s
|
|
2039
|
+
``test_output/<id>.txt`` (:func:`coord.confirm_test.write_confirmation_output`)
|
|
2040
|
+
before this returns, so the escalated fix worker's briefing
|
|
2041
|
+
(`coord/commands/plan_followup.py`, which already reads that file ahead of
|
|
2042
|
+
every other evidence source) quotes the real failure instead of the
|
|
2043
|
+
one-line *reason* alone. ``test_reason`` on the row stays exactly that
|
|
2044
|
+
one-line summary — #1337 deliberately keeps unbounded free text out of the
|
|
2045
|
+
board upsert, and this does not undo that; the file is the long form.
|
|
2036
2046
|
"""
|
|
2047
|
+
from coord.confirm_test import write_confirmation_output # noqa: PLC0415
|
|
2048
|
+
|
|
2037
2049
|
result = _run_pass_confirmation(transition, entry)
|
|
2038
2050
|
|
|
2039
2051
|
if result is None:
|
|
@@ -2044,6 +2056,24 @@ def _confirmed_pass_verdict(
|
|
|
2044
2056
|
"(#2464).",
|
|
2045
2057
|
)
|
|
2046
2058
|
|
|
2059
|
+
# Best-effort and unconditional on *kind*: REFUTED/BASELINE-RED/TIMEOUT/
|
|
2060
|
+
# INFRA/SIGNAL all carry a captured tail (`ConfirmationResult.output`) worth
|
|
2061
|
+
# keeping around; CONFIRMED and setup-stage inconclusives carry none, so
|
|
2062
|
+
# this is simply a no-op for them (`write_confirmation_output` checks
|
|
2063
|
+
# `.output` itself, and swallows `OSError`). Wrapped again here — this
|
|
2064
|
+
# runs inside the reap loop, and this whole module's standing rule is that
|
|
2065
|
+
# nothing in it may abandon a transition; a write failure must degrade to
|
|
2066
|
+
# "no file", never to a dropped verdict.
|
|
2067
|
+
try:
|
|
2068
|
+
write_confirmation_output(parent_id, result)
|
|
2069
|
+
except Exception as exc: # noqa: BLE001
|
|
2070
|
+
log.warning(
|
|
2071
|
+
"smoke %s: could not persist confirmation output for parent %s "
|
|
2072
|
+
"(%s) — the fix briefing will fall back to the one-line reason "
|
|
2073
|
+
"(#2563).",
|
|
2074
|
+
transition.assignment_id, parent_id, exc,
|
|
2075
|
+
)
|
|
2076
|
+
|
|
2047
2077
|
if result.refuted:
|
|
2048
2078
|
log.warning(
|
|
2049
2079
|
"smoke %s: REFUTED the pass claim for %s — %s\n%s",
|
|
@@ -2153,7 +2183,7 @@ def _record_smoke_verdict(
|
|
|
2153
2183
|
# claim would leave no trace it ever happened — including on the
|
|
2154
2184
|
# next reap of the same already-passed parent.
|
|
2155
2185
|
state, reason = _confirmed_pass_verdict(
|
|
2156
|
-
transition, entry,
|
|
2186
|
+
transition, entry, parent_id,
|
|
2157
2187
|
claim_reason="worker self-recorded via `coord test` (#2217)",
|
|
2158
2188
|
)
|
|
2159
2189
|
record_test_verdict(
|
|
@@ -2228,7 +2258,8 @@ def _record_smoke_verdict(
|
|
|
2228
2258
|
# never finished polling (#2272/#2301). Confirm it against a real run
|
|
2229
2259
|
# before it becomes a merge-gate-satisfying verdict.
|
|
2230
2260
|
state, reason = _confirmed_pass_verdict(
|
|
2231
|
-
transition, entry,
|
|
2261
|
+
transition, entry, parent_id,
|
|
2262
|
+
claim_reason="headless smoke reported SMOKE: pass",
|
|
2232
2263
|
)
|
|
2233
2264
|
record_test_verdict(
|
|
2234
2265
|
assignment_id=parent_id,
|
|
@@ -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
|
|
|
@@ -299,6 +299,30 @@ class TestConfirmBranch:
|
|
|
299
299
|
assert result.refuted is False
|
|
300
300
|
assert result.inconclusive is True
|
|
301
301
|
|
|
302
|
+
def test_timeout_captures_the_partial_output_before_the_kill(
|
|
303
|
+
self, checkout: Path
|
|
304
|
+
) -> None:
|
|
305
|
+
"""#2563: a timed-out suite still says SOMETHING — whatever it had
|
|
306
|
+
printed by the deadline. `subprocess.run(capture_output=True,
|
|
307
|
+
timeout=...)` fills `TimeoutExpired.stdout`/`.stderr` in on the way
|
|
308
|
+
out; before this, `confirm_branch` discarded both and a TIMEOUT
|
|
309
|
+
verdict carried strictly less evidence than a real failure did.
|
|
310
|
+
"""
|
|
311
|
+
runner = _ScriptedRunner(
|
|
312
|
+
default=subprocess.TimeoutExpired(
|
|
313
|
+
cmd="run-the-suite", timeout=1,
|
|
314
|
+
output="tests/test_x.py::test_a PASSED\ntests/test_x.py::test_b ",
|
|
315
|
+
stderr="Traceback (hung mid-test)",
|
|
316
|
+
)
|
|
317
|
+
)
|
|
318
|
+
result = ct.confirm_branch(
|
|
319
|
+
"api", BRANCH, _StubConfig(repo_path=str(checkout)), runner=runner,
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
assert result.kind == KIND_TIMEOUT, result.reason
|
|
323
|
+
assert "test_a PASSED" in result.output
|
|
324
|
+
assert "Traceback (hung mid-test)" in result.output
|
|
325
|
+
|
|
302
326
|
def test_signal_killed_suite_is_inconclusive_not_a_refutation(
|
|
303
327
|
self, checkout: Path
|
|
304
328
|
) -> None:
|
|
@@ -592,6 +616,54 @@ class TestConfirmationEnabled:
|
|
|
592
616
|
assert ct.confirmation_enabled(object()) is True
|
|
593
617
|
|
|
594
618
|
|
|
619
|
+
class TestWriteConfirmationOutput:
|
|
620
|
+
"""#2563: the missing write — a confirmation's captured tail must reach
|
|
621
|
+
``COORD_DIR/test_output/<assignment_id>.txt``, the same file `coord fix`
|
|
622
|
+
(`coord/commands/plan_followup.py`) already prefers over every other
|
|
623
|
+
evidence source when composing an escalated fix worker's briefing.
|
|
624
|
+
"""
|
|
625
|
+
|
|
626
|
+
def test_writes_the_output_tail_keyed_by_assignment_id(
|
|
627
|
+
self, isolated_coord_dir: Path
|
|
628
|
+
) -> None:
|
|
629
|
+
result = ct.ConfirmationResult(
|
|
630
|
+
kind=KIND_SUITE,
|
|
631
|
+
reason="the independently-run suite command FAILED (exit 1)",
|
|
632
|
+
output="tests/test_x.py::test_a FAILED\nE assert 0 == 1",
|
|
633
|
+
returncode=1,
|
|
634
|
+
)
|
|
635
|
+
|
|
636
|
+
stored = ct.write_confirmation_output("work-1", result)
|
|
637
|
+
|
|
638
|
+
expected = isolated_coord_dir / "test_output" / "work-1.txt"
|
|
639
|
+
assert stored == expected
|
|
640
|
+
assert expected.read_text() == result.output
|
|
641
|
+
|
|
642
|
+
def test_no_op_when_the_result_carries_no_output(
|
|
643
|
+
self, isolated_coord_dir: Path
|
|
644
|
+
) -> None:
|
|
645
|
+
"""`KIND_OK` (confirmed) and setup-stage inconclusives carry an empty
|
|
646
|
+
`.output` — nothing to persist, and nothing should be written."""
|
|
647
|
+
result = ct.ConfirmationResult(kind=KIND_OK, reason="passed", output="")
|
|
648
|
+
|
|
649
|
+
stored = ct.write_confirmation_output("work-1", result)
|
|
650
|
+
|
|
651
|
+
assert stored is None
|
|
652
|
+
assert not (isolated_coord_dir / "test_output").exists()
|
|
653
|
+
|
|
654
|
+
def test_a_write_failure_returns_none_rather_than_raising(
|
|
655
|
+
self, isolated_coord_dir: Path
|
|
656
|
+
) -> None:
|
|
657
|
+
"""This runs inside the reap path (`coord.notify`) — a read-only
|
|
658
|
+
`COORD_DIR`, a full disk, or any other `OSError` must degrade to "no
|
|
659
|
+
file", never abandon the verdict it is attached to."""
|
|
660
|
+
# A file sitting where the directory needs to go makes `mkdir` raise.
|
|
661
|
+
(isolated_coord_dir / "test_output").write_text("not a directory")
|
|
662
|
+
result = ct.ConfirmationResult(kind=KIND_SUITE, reason="x", output="boom")
|
|
663
|
+
|
|
664
|
+
assert ct.write_confirmation_output("work-1", result) is None
|
|
665
|
+
|
|
666
|
+
|
|
595
667
|
# ── the wiring: end to end through post_transition ───────────────────────────
|
|
596
668
|
|
|
597
669
|
|
|
@@ -714,6 +786,51 @@ class TestSmokeVerdictIsConfirmed:
|
|
|
714
786
|
f"guessing: {row['test_reason']!r}"
|
|
715
787
|
)
|
|
716
788
|
|
|
789
|
+
def test_refutation_leaves_the_captured_tail_for_the_fix_briefing(
|
|
790
|
+
self, coord_db, tmp_path: Path, isolated_coord_dir: Path
|
|
791
|
+
) -> None:
|
|
792
|
+
"""#2563: before this, `result.output` reached `log.warning` and
|
|
793
|
+
nowhere else — the escalated fix worker got a one-line reason and no
|
|
794
|
+
failing test names, no tracebacks. `coord fix`
|
|
795
|
+
(`coord/commands/plan_followup.py:962`) reads
|
|
796
|
+
`COORD_DIR/test_output/<parent_work_id>.txt` ahead of every other
|
|
797
|
+
evidence source, so that is where the captured tail must land — keyed
|
|
798
|
+
by the WORK row's id (`work-1`), not the confirming smoke
|
|
799
|
+
transition's (`smoke-1`), since that is the assignment a fix leg is
|
|
800
|
+
spawned from.
|
|
801
|
+
"""
|
|
802
|
+
self._record_work()
|
|
803
|
+
self._record_smoke()
|
|
804
|
+
transition, record, entry = self._transition(tmp_path, "SMOKE: pass")
|
|
805
|
+
captured_output = (
|
|
806
|
+
"tests/test_drive.py::test_a_dead_end_exit_code_reaches_the_"
|
|
807
|
+
"drive_exited_audit_row FAILED\n"
|
|
808
|
+
"tests/test_drive.py:2581: in "
|
|
809
|
+
"test_a_dead_end_exit_code_reaches_the_drive_exited_audit_row\n"
|
|
810
|
+
" assert len(escalations) == 1\n"
|
|
811
|
+
"E assert 0 == 1"
|
|
812
|
+
)
|
|
813
|
+
|
|
814
|
+
self._reap(
|
|
815
|
+
transition, record, entry,
|
|
816
|
+
ct.ConfirmationResult(
|
|
817
|
+
kind=KIND_SUITE,
|
|
818
|
+
reason="the independently-run suite command FAILED (exit 1)",
|
|
819
|
+
output=captured_output,
|
|
820
|
+
returncode=1,
|
|
821
|
+
),
|
|
822
|
+
)
|
|
823
|
+
|
|
824
|
+
stored = isolated_coord_dir / "test_output" / "work-1.txt"
|
|
825
|
+
assert stored.exists(), (
|
|
826
|
+
"a refuted pass claim must leave the captured tail at "
|
|
827
|
+
f"{stored} for `coord fix` to read"
|
|
828
|
+
)
|
|
829
|
+
assert stored.read_text() == captured_output
|
|
830
|
+
# And nothing lands under the smoke leg's OWN id — `coord fix` is
|
|
831
|
+
# dispatched against the work row, not the smoke transition.
|
|
832
|
+
assert not (isolated_coord_dir / "test_output" / "smoke-1.txt").exists()
|
|
833
|
+
|
|
717
834
|
def test_self_recorded_pass_is_overturned_by_a_failing_real_run(
|
|
718
835
|
self, coord_db, tmp_path: Path
|
|
719
836
|
) -> None:
|
|
@@ -850,9 +967,14 @@ class TestSmokeVerdictIsConfirmed:
|
|
|
850
967
|
)
|
|
851
968
|
|
|
852
969
|
def test_baseline_red_confirmation_records_skipped(
|
|
853
|
-
self, coord_db, tmp_path: Path
|
|
970
|
+
self, coord_db, tmp_path: Path, isolated_coord_dir: Path
|
|
854
971
|
) -> None:
|
|
855
|
-
"""#2170's convention: not the branch's fault, so no fix round burns.
|
|
972
|
+
"""#2170's convention: not the branch's fault, so no fix round burns.
|
|
973
|
+
|
|
974
|
+
#2563: a `skipped` verdict whose evidence is unreadable is only
|
|
975
|
+
marginally better than a bare one — the baseline-red tail gets the
|
|
976
|
+
same test_output-file treatment as a REFUTED one.
|
|
977
|
+
"""
|
|
856
978
|
self._record_work()
|
|
857
979
|
self._record_smoke()
|
|
858
980
|
transition, record, entry = self._transition(tmp_path, "SMOKE: pass")
|
|
@@ -860,7 +982,9 @@ class TestSmokeVerdictIsConfirmed:
|
|
|
860
982
|
self._reap(
|
|
861
983
|
transition, record, entry,
|
|
862
984
|
ct.ConfirmationResult(
|
|
863
|
-
kind=KIND_BASELINE_RED,
|
|
985
|
+
kind=KIND_BASELINE_RED,
|
|
986
|
+
reason="every failure reproduces on the base",
|
|
987
|
+
output="tests/test_x.py::test_a FAILED (also red on main)",
|
|
864
988
|
),
|
|
865
989
|
)
|
|
866
990
|
|
|
@@ -868,6 +992,8 @@ class TestSmokeVerdictIsConfirmed:
|
|
|
868
992
|
assert row["test_state"] == "skipped", (
|
|
869
993
|
f"expected 'skipped' for a red baseline, got {row['test_state']!r}"
|
|
870
994
|
)
|
|
995
|
+
stored = isolated_coord_dir / "test_output" / "work-1.txt"
|
|
996
|
+
assert stored.read_text() == "tests/test_x.py::test_a FAILED (also red on main)"
|
|
871
997
|
|
|
872
998
|
def test_a_fail_marker_does_not_spend_a_confirmation_run(
|
|
873
999
|
self, coord_db, tmp_path: Path
|
|
@@ -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,
|
|
@@ -2689,7 +2689,7 @@ class TestConfirmedPassVerdictSignalKill:
|
|
|
2689
2689
|
"coord.notify._run_pass_confirmation", return_value=killed,
|
|
2690
2690
|
):
|
|
2691
2691
|
state, reason = _confirmed_pass_verdict(
|
|
2692
|
-
self._transition(), entry, claim_reason="SMOKE: pass",
|
|
2692
|
+
self._transition(), entry, "work-1", claim_reason="SMOKE: pass",
|
|
2693
2693
|
)
|
|
2694
2694
|
|
|
2695
2695
|
assert state == "passed", (
|