code-coordinator 0.5.231__tar.gz → 0.5.232__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.231 → code_coordinator-0.5.232}/PKG-INFO +1 -1
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/acceptance.py +229 -25
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/acceptance.py +2 -1
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/conflict_fix.py +64 -35
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/milestone_dispatch.py +58 -14
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/models.py +18 -8
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notify.py +7 -2
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/test_author.py +47 -22
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_acceptance.py +178 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_conflict_fix.py +27 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_milestone_dispatch.py +66 -2
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_test_author.py +35 -4
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/.gitignore +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/CLAUDE.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/GOAL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/LICENSE +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/MANIFEST.in +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/README.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/__init__.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/agent.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/audit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/block_log.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/board_service.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/brain.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/claim.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/cli.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/client.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/comments.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/config.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/dao.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/db.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/deps.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/drive.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/events.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/filelock.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/freshness.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/gates.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/goal.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/context.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/models.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/render.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/health/units.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/hooks.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/interactive.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/network.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/openapi.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/parentage.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/plans.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/progress.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/release_window.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/reports.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/review.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/self_health.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/smoke.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/split_work.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/state.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/test_report.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/usage.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/install-agent.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/pyproject.toml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/setup.cfg +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/__init__.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/conftest.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_config.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_db.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_events.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_init.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_models.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_network.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_review.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_session.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_split.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_state.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.231 → code_coordinator-0.5.232}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -199,17 +199,80 @@ class ManifestError(Exception):
|
|
|
199
199
|
"""Raised when a manifest file exists but is malformed."""
|
|
200
200
|
|
|
201
201
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
202
|
+
# #2543: per-issue manifest fragments. Before this, every JIT test-author
|
|
203
|
+
# slice appended its own `issues:`/`expected_red:` block to ONE shared
|
|
204
|
+
# `ms-NN/manifest.yml` (`coord.test_author`'s "Later slices MERGE into this
|
|
205
|
+
# file" convention) — two slices authored concurrently, or one authored
|
|
206
|
+
# against a base that predates a sibling's already-merged slice, collide on
|
|
207
|
+
# that single file even though their actual content never overlaps (each
|
|
208
|
+
# writes a distinct, differently-keyed block). See coord-portal#122/#128/#132.
|
|
209
|
+
#
|
|
210
|
+
# The fix: each issue's `issues:`/`expected_red:` entries live in their OWN
|
|
211
|
+
# file, `ms-NN/manifest.d/<issue>.(yml|yaml|json)` — two slices writing two
|
|
212
|
+
# different files can never textually conflict, no matter how they're
|
|
213
|
+
# scheduled. `manifest.yml` itself keeps carrying the MILESTONE-level blocks
|
|
214
|
+
# (`gate_a:`, `exempt:`) that are rare, hand-edited, and not part of the
|
|
215
|
+
# per-slice JIT-authoring hot path, so it stays a single shared file by
|
|
216
|
+
# choice, not oversight.
|
|
217
|
+
#
|
|
218
|
+
# Backward compatible by construction: every reader below still accepts a
|
|
219
|
+
# legacy single-file `ms-NN/manifest.(yml|json)` that ALSO carries
|
|
220
|
+
# `issues:`/`tests:`/`expected_red:` (this repo's own already-merged
|
|
221
|
+
# `tests/acceptance/ms-33/manifest.yml` and friends) — fragments and a
|
|
222
|
+
# legacy file under the same `ms-NN/` dir are simply merged together, same
|
|
223
|
+
# "later manifest wins on a bare collision" rule as across milestones. No
|
|
224
|
+
# migration script is needed: existing manifests keep working as-is, and new
|
|
225
|
+
# per-issue entries land in `manifest.d/` going forward.
|
|
226
|
+
MANIFEST_FRAGMENTS_DIRNAME = "manifest.d"
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def _manifest_fragment_paths(ms_dir: Path) -> list[Path]:
|
|
230
|
+
"""``<ms_dir>/manifest.d/*.(yml|yaml|json)`` fragment files, sorted for
|
|
231
|
+
deterministic scan order. ``[]`` when the fragments dir doesn't exist."""
|
|
232
|
+
frag_dir = ms_dir / MANIFEST_FRAGMENTS_DIRNAME
|
|
233
|
+
if not frag_dir.is_dir():
|
|
206
234
|
return []
|
|
207
235
|
return sorted(
|
|
208
|
-
p for p in
|
|
209
|
-
if p.suffix in (".yml", ".yaml", ".json")
|
|
236
|
+
p for p in frag_dir.iterdir()
|
|
237
|
+
if p.is_file() and p.suffix in (".yml", ".yaml", ".json")
|
|
210
238
|
)
|
|
211
239
|
|
|
212
240
|
|
|
241
|
+
def _manifest_paths(acceptance_root: Path) -> list[Path]:
|
|
242
|
+
"""Every manifest SOURCE path under *acceptance_root*, sorted for
|
|
243
|
+
deterministic scan order: per ``ms-NN``/``issue-NN`` directory, the
|
|
244
|
+
legacy single-file ``manifest.(yml|yaml|json)`` (if present) followed by
|
|
245
|
+
each ``manifest.d/<issue>.(yml|yaml|json)`` fragment (#2543). ``[]`` when
|
|
246
|
+
*acceptance_root* doesn't exist.
|
|
247
|
+
|
|
248
|
+
Callers that need to know which owning directory a given path came from
|
|
249
|
+
(a fragment's is its grandparent, not its parent) should go through
|
|
250
|
+
:func:`_ms_dir_for_manifest_path` rather than assuming ``path.parent``.
|
|
251
|
+
"""
|
|
252
|
+
if not acceptance_root.exists():
|
|
253
|
+
return []
|
|
254
|
+
paths: list[Path] = []
|
|
255
|
+
for ms_dir in sorted(p for p in acceptance_root.iterdir() if p.is_dir()):
|
|
256
|
+
paths.extend(
|
|
257
|
+
sorted(
|
|
258
|
+
p for p in ms_dir.glob("manifest.*")
|
|
259
|
+
if p.suffix in (".yml", ".yaml", ".json")
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
paths.extend(_manifest_fragment_paths(ms_dir))
|
|
263
|
+
return paths
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def _ms_dir_for_manifest_path(path: Path) -> Path:
|
|
267
|
+
"""The owning ``ms-NN``/``issue-NN`` directory for a manifest source
|
|
268
|
+
*path* returned by :func:`_manifest_paths` — itself for a legacy
|
|
269
|
+
single-file manifest, or its grandparent for a
|
|
270
|
+
``manifest.d/<issue>.(yml|json)`` fragment (#2543)."""
|
|
271
|
+
if path.parent.name == MANIFEST_FRAGMENTS_DIRNAME:
|
|
272
|
+
return path.parent.parent
|
|
273
|
+
return path.parent
|
|
274
|
+
|
|
275
|
+
|
|
213
276
|
@dataclass(frozen=True)
|
|
214
277
|
class ManifestData:
|
|
215
278
|
"""One manifest file's parsed contents: the test-id -> issue-number
|
|
@@ -329,6 +392,50 @@ def parse_manifest_text(text: str, *, source: str = "<manifest>") -> ManifestDat
|
|
|
329
392
|
)
|
|
330
393
|
|
|
331
394
|
|
|
395
|
+
def merge_manifest_data(*datas: ManifestData) -> ManifestData:
|
|
396
|
+
"""Merge multiple :class:`ManifestData` instances into one, as if their
|
|
397
|
+
source files had been scanned together (#2543) — same "later source
|
|
398
|
+
wins on a bare collision" rule :func:`load_manifest`/:func:`_manifest_paths`
|
|
399
|
+
already apply across files, just operating on already-parsed data
|
|
400
|
+
instead of paths. Shared by both the local-checkout readers (which
|
|
401
|
+
merge ``_manifest_paths``' legacy-file-then-fragments per ``ms-NN``) and
|
|
402
|
+
the API-only dispatch-time reader
|
|
403
|
+
(:func:`coord.milestone_dispatch._fetch_manifest_data`, which fetches
|
|
404
|
+
the legacy file and one issue's fragment separately over ``gh`` and
|
|
405
|
+
needs to combine them the same way).
|
|
406
|
+
|
|
407
|
+
``tests``/``exempt``/``expected_red`` union across every *datas* entry
|
|
408
|
+
(a later entry's ``tests`` mapping overwrites an earlier one's on an
|
|
409
|
+
exact test-id collision; ``exempt``/``expected_red`` union rather than
|
|
410
|
+
overwrite since those are naturally per-issue-keyed sets, not a flat
|
|
411
|
+
mapping that can collide). ``gate_a_exempt``/``gate_a_exempt_reason``
|
|
412
|
+
are milestone-level, not per-issue, so they come from whichever entry
|
|
413
|
+
sets ``gate_a_exempt=True`` last — in practice always the legacy shared
|
|
414
|
+
file, since only that carries the ``gate_a:`` block (#2543 keeps it
|
|
415
|
+
there by choice; per-issue fragments never set it).
|
|
416
|
+
"""
|
|
417
|
+
tests: dict[str, int] = {}
|
|
418
|
+
exempt: set[int] = set()
|
|
419
|
+
expected_red: dict[int, frozenset[str]] = {}
|
|
420
|
+
gate_a_exempt = False
|
|
421
|
+
gate_a_exempt_reason = ""
|
|
422
|
+
for data in datas:
|
|
423
|
+
tests.update(data.tests)
|
|
424
|
+
exempt |= set(data.exempt)
|
|
425
|
+
for issue_number, test_ids in data.expected_red.items():
|
|
426
|
+
expected_red[issue_number] = expected_red.get(issue_number, frozenset()) | test_ids
|
|
427
|
+
if data.gate_a_exempt:
|
|
428
|
+
gate_a_exempt = True
|
|
429
|
+
gate_a_exempt_reason = data.gate_a_exempt_reason or gate_a_exempt_reason
|
|
430
|
+
return ManifestData(
|
|
431
|
+
tests=tests,
|
|
432
|
+
exempt=frozenset(exempt),
|
|
433
|
+
gate_a_exempt=gate_a_exempt,
|
|
434
|
+
gate_a_exempt_reason=gate_a_exempt_reason,
|
|
435
|
+
expected_red=expected_red,
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
|
|
332
439
|
def _parse_manifest_file(path: Path) -> dict[str, int]:
|
|
333
440
|
"""Parse one manifest file into ``{test_id: issue_number}`` (the
|
|
334
441
|
``exempt:`` list, if any, is dropped — callers that need it use
|
|
@@ -415,7 +522,7 @@ def load_expected_red(
|
|
|
415
522
|
mapping: dict[str, int] = {}
|
|
416
523
|
for path in _manifest_paths(acceptance_root):
|
|
417
524
|
if driver_kind is not None:
|
|
418
|
-
resolved = _driver_kind_for_manifest_dir(path
|
|
525
|
+
resolved = _driver_kind_for_manifest_dir(_ms_dir_for_manifest_path(path))
|
|
419
526
|
if resolved is not None and resolved != driver_kind:
|
|
420
527
|
continue
|
|
421
528
|
try:
|
|
@@ -441,7 +548,7 @@ def ms_dir_for_issue(acceptance_root: Path, issue_number: int) -> str | None:
|
|
|
441
548
|
for path in _manifest_paths(acceptance_root):
|
|
442
549
|
mapping = _parse_manifest_file(path)
|
|
443
550
|
if test_ids_for_issue(mapping, issue_number):
|
|
444
|
-
return path.
|
|
551
|
+
return _ms_dir_for_manifest_path(path).name
|
|
445
552
|
return None
|
|
446
553
|
|
|
447
554
|
|
|
@@ -873,16 +980,27 @@ def _default_github_ops():
|
|
|
873
980
|
return github_ops
|
|
874
981
|
|
|
875
982
|
|
|
876
|
-
def
|
|
877
|
-
repo_github: str,
|
|
983
|
+
def _fetch_manifest_source_via_api(
|
|
984
|
+
repo_github: str,
|
|
985
|
+
branch: str,
|
|
986
|
+
dir_path: str,
|
|
987
|
+
filename_stem: str,
|
|
988
|
+
get_file: Callable[..., "tuple[str, str]"],
|
|
878
989
|
) -> "tuple[str, str, str, ManifestData] | None":
|
|
879
|
-
"""One
|
|
880
|
-
``get_repo_file_with_sha``-shaped callable),
|
|
881
|
-
turn like :func:`_manifest_paths` does on local
|
|
882
|
-
text, blob_sha, data)`` for the first extension
|
|
883
|
-
or ``None`` if none does / the one that exists is
|
|
990
|
+
"""One manifest source file — ``<dir_path>/<filename_stem>.(yml|yaml|
|
|
991
|
+
json)`` — via *get_file* (a ``get_repo_file_with_sha``-shaped callable),
|
|
992
|
+
trying each extension in turn like :func:`_manifest_paths` does on local
|
|
993
|
+
disk. Returns ``(path, text, blob_sha, data)`` for the first extension
|
|
994
|
+
that exists and parses, or ``None`` if none does / the one that exists is
|
|
995
|
+
malformed.
|
|
996
|
+
|
|
997
|
+
Shared primitive (#2543) behind both the legacy single-file fetch
|
|
998
|
+
(:func:`_fetch_ms_manifest_via_api`, ``filename_stem="manifest"``) and a
|
|
999
|
+
per-issue fragment fetch (:func:`_fetch_ms_manifest_fragment_via_api`,
|
|
1000
|
+
``filename_stem=str(issue_number)`` under ``<ms_dir>/manifest.d/``).
|
|
1001
|
+
"""
|
|
884
1002
|
for ext in (".yml", ".yaml", ".json"):
|
|
885
|
-
path = f"{
|
|
1003
|
+
path = f"{dir_path}/{filename_stem}{ext}"
|
|
886
1004
|
try:
|
|
887
1005
|
text, blob_sha = get_file(repo_github, path, branch)
|
|
888
1006
|
except Exception: # noqa: BLE001 — this extension doesn't exist, or a transient gh hiccup
|
|
@@ -895,13 +1013,52 @@ def _fetch_ms_manifest_via_api(
|
|
|
895
1013
|
return None
|
|
896
1014
|
|
|
897
1015
|
|
|
1016
|
+
def _fetch_ms_manifest_via_api(
|
|
1017
|
+
repo_github: str, branch: str, ms_dir: str, get_file: Callable[..., "tuple[str, str]"],
|
|
1018
|
+
) -> "tuple[str, str, str, ManifestData] | None":
|
|
1019
|
+
"""One ms-dir's LEGACY single-file ``manifest.(yml|yaml|json)`` via
|
|
1020
|
+
*get_file* — see :func:`_fetch_manifest_source_via_api`. Since #2543,
|
|
1021
|
+
per-issue data more commonly lives in a ``manifest.d/<issue>.(yml|json)``
|
|
1022
|
+
fragment instead (:func:`_fetch_ms_manifest_fragment_via_api`); this
|
|
1023
|
+
still covers the milestone-level ``gate_a:``/``exempt:`` blocks (which
|
|
1024
|
+
stay in the single shared file by choice, #2543) and any not-yet-migrated
|
|
1025
|
+
milestone whose per-issue data is still all in one file."""
|
|
1026
|
+
return _fetch_manifest_source_via_api(
|
|
1027
|
+
repo_github, branch, f"{ACCEPTANCE_DIRNAME}/{ms_dir}", "manifest", get_file,
|
|
1028
|
+
)
|
|
1029
|
+
|
|
1030
|
+
|
|
1031
|
+
def _fetch_ms_manifest_fragment_via_api(
|
|
1032
|
+
repo_github: str,
|
|
1033
|
+
branch: str,
|
|
1034
|
+
ms_dir: str,
|
|
1035
|
+
issue_number: int,
|
|
1036
|
+
get_file: Callable[..., "tuple[str, str]"],
|
|
1037
|
+
) -> "tuple[str, str, str, ManifestData] | None":
|
|
1038
|
+
"""*issue_number*'s own ``ms-NN/manifest.d/<issue_number>.(yml|yaml|
|
|
1039
|
+
json)`` fragment via *get_file* (#2543) — see
|
|
1040
|
+
:func:`_fetch_manifest_source_via_api`. A targeted fetch by exact,
|
|
1041
|
+
predictable filename, no directory listing required, since the caller
|
|
1042
|
+
already knows the issue number it's looking for."""
|
|
1043
|
+
return _fetch_manifest_source_via_api(
|
|
1044
|
+
repo_github,
|
|
1045
|
+
branch,
|
|
1046
|
+
f"{ACCEPTANCE_DIRNAME}/{ms_dir}/{MANIFEST_FRAGMENTS_DIRNAME}",
|
|
1047
|
+
str(issue_number),
|
|
1048
|
+
get_file,
|
|
1049
|
+
)
|
|
1050
|
+
|
|
1051
|
+
|
|
898
1052
|
def find_ms_manifest_for_issue_via_api(
|
|
899
1053
|
repo_github: str, branch: str, issue_number: int, *, gh_ops: Any = None,
|
|
900
1054
|
) -> "tuple[str, str, str, ManifestData] | None":
|
|
901
1055
|
"""API-only (no local checkout) equivalent of :func:`ms_dir_for_issue`:
|
|
902
|
-
search every ``tests/acceptance/ms
|
|
903
|
-
|
|
904
|
-
|
|
1056
|
+
search every ``tests/acceptance/ms-*/`` on *branch* via the GitHub
|
|
1057
|
+
Contents API for the one whose ``tests``/``issues``/``expected_red``
|
|
1058
|
+
mapping covers *issue_number* — checking, per ms-dir, *issue_number*'s
|
|
1059
|
+
own ``manifest.d/<issue_number>.(yml|json)`` fragment (#2543) FIRST
|
|
1060
|
+
(a targeted, exact-filename fetch), then the legacy single-file
|
|
1061
|
+
``manifest.(yml|yaml|json)``.
|
|
905
1062
|
|
|
906
1063
|
Returns ``(path, text, blob_sha, data)`` for the first match (ms-dirs
|
|
907
1064
|
scanned in sorted-name order for determinism), or ``None`` when nothing
|
|
@@ -923,6 +1080,15 @@ def find_ms_manifest_for_issue_via_api(
|
|
|
923
1080
|
return None
|
|
924
1081
|
|
|
925
1082
|
for name in sorted(subdirs):
|
|
1083
|
+
frag = _fetch_ms_manifest_fragment_via_api(
|
|
1084
|
+
repo_github, branch, name, issue_number, get_file,
|
|
1085
|
+
)
|
|
1086
|
+
if frag is not None:
|
|
1087
|
+
_path, _text, _blob_sha, data = frag
|
|
1088
|
+
if issue_number in data.expected_red or test_ids_for_issue(
|
|
1089
|
+
data.tests, issue_number
|
|
1090
|
+
):
|
|
1091
|
+
return frag
|
|
926
1092
|
found = _fetch_ms_manifest_via_api(repo_github, branch, name, get_file)
|
|
927
1093
|
if found is None:
|
|
928
1094
|
continue
|
|
@@ -1014,10 +1180,19 @@ def list_expected_red_via_api(
|
|
|
1014
1180
|
with at least one expected_red entry are included. ``{}`` on any
|
|
1015
1181
|
listing failure or when nothing is expected-red anywhere (best-effort,
|
|
1016
1182
|
matches the rest of this module's read paths).
|
|
1183
|
+
|
|
1184
|
+
#2543: merges BOTH the legacy single-file ``manifest.(yml|json)`` and
|
|
1185
|
+
every ``manifest.d/<issue>.(yml|json)`` fragment for each ms-dir — a
|
|
1186
|
+
milestone whose per-issue data has moved to fragments must not go dark
|
|
1187
|
+
here just because ``list_repo_dir`` (needed to enumerate the fragments
|
|
1188
|
+
dir) is unavailable on *gh_ops*: that case degrades to "legacy file
|
|
1189
|
+
only", same fail-open posture as everywhere else in this module, not to
|
|
1190
|
+
"nothing found."
|
|
1017
1191
|
"""
|
|
1018
1192
|
ops = gh_ops or _default_github_ops()
|
|
1019
1193
|
list_subdirs = getattr(ops, "list_repo_subdirs", None)
|
|
1020
1194
|
get_file = getattr(ops, "get_repo_file_with_sha", None)
|
|
1195
|
+
list_dir = getattr(ops, "list_repo_dir", None)
|
|
1021
1196
|
if list_subdirs is None or get_file is None:
|
|
1022
1197
|
return {}
|
|
1023
1198
|
try:
|
|
@@ -1027,12 +1202,37 @@ def list_expected_red_via_api(
|
|
|
1027
1202
|
|
|
1028
1203
|
out: dict[str, dict[int, frozenset[str]]] = {}
|
|
1029
1204
|
for name in sorted(subdirs):
|
|
1205
|
+
merged: dict[int, frozenset[str]] = {}
|
|
1206
|
+
|
|
1030
1207
|
found = _fetch_ms_manifest_via_api(repo_github, branch, name, get_file)
|
|
1031
|
-
if found is None:
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1208
|
+
if found is not None:
|
|
1209
|
+
_path, _text, _blob_sha, data = found
|
|
1210
|
+
for issue, ids in data.expected_red.items():
|
|
1211
|
+
merged[issue] = merged.get(issue, frozenset()) | ids
|
|
1212
|
+
|
|
1213
|
+
if list_dir is not None:
|
|
1214
|
+
frag_dir = f"{ACCEPTANCE_DIRNAME}/{name}/{MANIFEST_FRAGMENTS_DIRNAME}"
|
|
1215
|
+
try:
|
|
1216
|
+
filenames = list_dir(repo_github, frag_dir, branch)
|
|
1217
|
+
except Exception: # noqa: BLE001 — no fragments dir, or a transient hiccup
|
|
1218
|
+
filenames = []
|
|
1219
|
+
for filename in filenames:
|
|
1220
|
+
if Path(filename).suffix not in (".yml", ".yaml", ".json"):
|
|
1221
|
+
continue
|
|
1222
|
+
frag_path = f"{frag_dir}/{filename}"
|
|
1223
|
+
try:
|
|
1224
|
+
text, _sha = get_file(repo_github, frag_path, branch)
|
|
1225
|
+
except Exception: # noqa: BLE001
|
|
1226
|
+
continue
|
|
1227
|
+
try:
|
|
1228
|
+
frag_data = parse_manifest_text(text, source=frag_path)
|
|
1229
|
+
except ManifestError:
|
|
1230
|
+
continue
|
|
1231
|
+
for issue, ids in frag_data.expected_red.items():
|
|
1232
|
+
merged[issue] = merged.get(issue, frozenset()) | ids
|
|
1233
|
+
|
|
1234
|
+
if merged:
|
|
1235
|
+
out[name] = merged
|
|
1036
1236
|
return out
|
|
1037
1237
|
|
|
1038
1238
|
|
|
@@ -1101,7 +1301,11 @@ def clear_expected_red_via_pr(
|
|
|
1101
1301
|
except Exception as exc: # noqa: BLE001
|
|
1102
1302
|
return f"warning: could not resolve {default_branch} tip: {exc}"
|
|
1103
1303
|
|
|
1104
|
-
|
|
1304
|
+
# #2543: for a manifest.d/<issue>.yml fragment, path.parent is the
|
|
1305
|
+
# `manifest.d` directory itself, not the ms-NN dir — go through
|
|
1306
|
+
# _ms_dir_for_manifest_path so a fragment-clear derives the SAME
|
|
1307
|
+
# branch-name component a legacy-file clear would.
|
|
1308
|
+
ms_dir = _ms_dir_for_manifest_path(Path(path)).name if "/" in path else "ms"
|
|
1105
1309
|
branch_name = f"coord/clear-expected-red-{issue_number}-{ms_dir}"
|
|
1106
1310
|
# #944-style idempotency: a prior attempt may have already created this
|
|
1107
1311
|
# branch (e.g. a partial failure on a previous merge-queue tick) — a
|
|
@@ -209,7 +209,8 @@ def _scoped_verdict(
|
|
|
209
209
|
"--ci", "ci_mode", is_flag=True,
|
|
210
210
|
help=(
|
|
211
211
|
"#2164: the CI wrapper. Only valid with --all. Honours each "
|
|
212
|
-
"ms-NN/manifest.yml
|
|
212
|
+
"ms-NN/manifest.yml AND manifest.d/<issue>.yml fragment's (#2543) "
|
|
213
|
+
"`expected_red:` registry — a listed test-id "
|
|
213
214
|
"that FAILS does not fail the run (a sealed slice is red by design "
|
|
214
215
|
"before its fix exists); one that PASSES is a hard, loud failure "
|
|
215
216
|
"(the vacuous-assertion case #1965 cares about). Point your repo's "
|
|
@@ -40,6 +40,7 @@ import uuid
|
|
|
40
40
|
|
|
41
41
|
import httpx
|
|
42
42
|
|
|
43
|
+
from coord.acceptance import MANIFEST_FRAGMENTS_DIRNAME
|
|
43
44
|
from coord.config import Config
|
|
44
45
|
from coord.dispatch import AGENT_PORT
|
|
45
46
|
from coord.merge_queue import QueuedMerge
|
|
@@ -245,10 +246,13 @@ date or conflicts with another slice.
|
|
|
245
246
|
This repo's CLAUDE.md tells every ordinary worker to never touch \
|
|
246
247
|
`tests/acceptance/**` — that rule keeps the acceptance oracle independent \
|
|
247
248
|
of the workers it grades. It does NOT apply to you for this one narrow \
|
|
248
|
-
purpose: resolving a merge conflict in a milestone's \
|
|
249
|
-
`tests/acceptance/ms-NN/{SEALED_MANIFEST_FILENAME}
|
|
250
|
-
|
|
251
|
-
|
|
249
|
+
purpose: resolving a merge conflict in a milestone's shared \
|
|
250
|
+
`tests/acceptance/ms-NN/{SEALED_MANIFEST_FILENAME}` and/or a per-issue \
|
|
251
|
+
`tests/acceptance/ms-NN/manifest.d/<issue>.(yml|json)` fragment (#2543 — \
|
|
252
|
+
each issue's own manifest data lives in its own fragment file now, so a \
|
|
253
|
+
DIFFERENT-issue collision mostly can't happen any more; this path is for a \
|
|
254
|
+
legacy single-file milestone or a same-issue retry). You are explicitly \
|
|
255
|
+
authorized to edit ONLY those manifest file(s), and only additively.
|
|
252
256
|
|
|
253
257
|
Rules:
|
|
254
258
|
- The coordinator denies `gh` and `git push --force` for this worker. \
|
|
@@ -256,21 +260,22 @@ Don't try to use them — the harness will reject the call.
|
|
|
256
260
|
- Stay on the worker's branch — do NOT push to main / develop / target.
|
|
257
261
|
- Use git push --force-with-lease (NOT --force).
|
|
258
262
|
- Rebase onto the target branch. If the ONLY conflict is inside a \
|
|
259
|
-
`{SEALED_MANIFEST_FILENAME}`
|
|
260
|
-
ADDITIVELY: keep BOTH sides' issue
|
|
261
|
-
any block that isn't yours. Never
|
|
262
|
-
— this mirrors the "one block per
|
|
263
|
-
manifest files document in their
|
|
263
|
+
`{SEALED_MANIFEST_FILENAME}` or a `manifest.d/<issue>.(yml|json)` fragment \
|
|
264
|
+
under `tests/acceptance/`, resolve it ADDITIVELY: keep BOTH sides' issue \
|
|
265
|
+
blocks, without reordering or rewriting any block that isn't yours. Never \
|
|
266
|
+
delete or rewrite another issue's block — this mirrors the "one block per \
|
|
267
|
+
issue, later slices merge in" rule the manifest files document in their \
|
|
268
|
+
own header comment.
|
|
264
269
|
- Do NOT create, edit, or delete ANY OTHER file under `tests/acceptance/` \
|
|
265
270
|
— not a test body, not `contract.md`, not a mock, not a fixture, not an \
|
|
266
271
|
entry-point registration. Those stay sealed even for you.
|
|
267
|
-
- If the conflict is NOT confined to a `{SEALED_MANIFEST_FILENAME}`
|
|
268
|
-
also touches a test body or
|
|
269
|
-
|
|
270
|
-
(e.g. the same issue's own block was edited two different
|
|
271
|
-
GUESS and do NOT touch it. Exit non-zero with a STUCK: line
|
|
272
|
-
with the exact marker `{SEALED_SCOPE_STUCK_MARKER}` and then
|
|
273
|
-
file(s) in conflict, e.g.
|
|
272
|
+
- If the conflict is NOT confined to a `{SEALED_MANIFEST_FILENAME}` or a \
|
|
273
|
+
`manifest.d/<issue>.(yml|json)` fragment — it also touches a test body or \
|
|
274
|
+
any other sealed file, OR the manifest conflict itself is not a clean \
|
|
275
|
+
additive case (e.g. the same issue's own block was edited two different \
|
|
276
|
+
ways) — DO NOT GUESS and do NOT touch it. Exit non-zero with a STUCK: line \
|
|
277
|
+
that starts with the exact marker `{SEALED_SCOPE_STUCK_MARKER}` and then \
|
|
278
|
+
names the file(s) in conflict, e.g.
|
|
274
279
|
STUCK: {SEALED_SCOPE_STUCK_MARKER} tests/acceptance/ms-33/audit.rs:1-40 \
|
|
275
280
|
— conflict is in a test body, not {SEALED_MANIFEST_FILENAME}
|
|
276
281
|
The coordinator reads that marker and hands this off to a human — there is \
|
|
@@ -296,15 +301,17 @@ def build_sealed_manifest_conflict_briefing(
|
|
|
296
301
|
:data:`coord.models.SEALED_PATH_AUTHOR_TYPES` branch (#2555).
|
|
297
302
|
|
|
298
303
|
Unlike :func:`build_conflict_fix_briefing`, this worker IS authorized to
|
|
299
|
-
edit
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
two-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
304
|
+
edit the sealed manifest — the milestone's shared ``manifest.yml`` and/or
|
|
305
|
+
a per-issue ``manifest.d/<issue>.(yml|json)`` fragment (#2543) — because
|
|
306
|
+
those are mechanical, written-down-rule merges (an issue's own block, or
|
|
307
|
+
a legacy milestone's additive block), not semantic ones. Since #2543 the
|
|
308
|
+
common two-DIFFERENT-slices collision this was built for mostly can't
|
|
309
|
+
happen any more (each issue writes its own fragment file), but a legacy
|
|
310
|
+
milestone or a same-issue retry can still land here. Everything else
|
|
311
|
+
under ``tests/acceptance/`` stays off-limits — see
|
|
312
|
+
:data:`SEALED_MANIFEST_CONFLICT_SYSTEM_PROMPT`'s "Rules" for the exact
|
|
313
|
+
boundary and :data:`SEALED_SCOPE_STUCK_MARKER`, the marker the worker
|
|
314
|
+
uses to escalate when the conflict crosses it.
|
|
308
315
|
"""
|
|
309
316
|
test_cmd = test_command or "echo '(no test command configured)'"
|
|
310
317
|
lines: list[str] = [
|
|
@@ -316,8 +323,8 @@ def build_sealed_manifest_conflict_briefing(
|
|
|
316
323
|
f"Issue: #{entry.issue_number} — {entry.issue_title}",
|
|
317
324
|
f"Assignment type: `{entry.assignment_type}` — this branch's whole "
|
|
318
325
|
"job was authoring under `tests/acceptance/`, so its conflict is "
|
|
319
|
-
f"almost always
|
|
320
|
-
|
|
326
|
+
f"almost always an additive edit to a `{SEALED_MANIFEST_FILENAME}` "
|
|
327
|
+
"or a `manifest.d/<issue>.(yml|json)` fragment (#2543).",
|
|
321
328
|
"",
|
|
322
329
|
"## Where you are",
|
|
323
330
|
"",
|
|
@@ -334,7 +341,8 @@ def build_sealed_manifest_conflict_briefing(
|
|
|
334
341
|
"1. `git fetch origin`",
|
|
335
342
|
f"2. `git pull --rebase origin {entry.target_branch}`",
|
|
336
343
|
f"3. If a conflict marker appears in a `{SEALED_MANIFEST_FILENAME}` "
|
|
337
|
-
"
|
|
344
|
+
"or a `manifest.d/<issue>.(yml|json)` fragment under "
|
|
345
|
+
"`tests/acceptance/`, resolve it by keeping BOTH sides' issue "
|
|
338
346
|
"blocks (additive — see the system prompt's rules). If a conflict "
|
|
339
347
|
"marker appears ANYWHERE ELSE, stop — see \"When NOT to guess\" "
|
|
340
348
|
"below.",
|
|
@@ -344,12 +352,13 @@ def build_sealed_manifest_conflict_briefing(
|
|
|
344
352
|
"",
|
|
345
353
|
"## When NOT to guess",
|
|
346
354
|
"",
|
|
347
|
-
f"You are authorized to edit ONLY a `{SEALED_MANIFEST_FILENAME}` "
|
|
348
|
-
"
|
|
355
|
+
f"You are authorized to edit ONLY a `{SEALED_MANIFEST_FILENAME}` or "
|
|
356
|
+
"a `manifest.d/<issue>.(yml|json)` fragment under "
|
|
357
|
+
"`tests/acceptance/`, and only additively. If the conflict "
|
|
349
358
|
"touches a test body, `contract.md`, a mock, a fixture, an "
|
|
350
359
|
"entry-point registration, or anything else sealed — or the "
|
|
351
|
-
|
|
352
|
-
"
|
|
360
|
+
"manifest conflict is not a clean additive case — DO NOT touch it. "
|
|
361
|
+
"Exit non-zero with a `STUCK:` line "
|
|
353
362
|
f"starting with the exact marker `{SEALED_SCOPE_STUCK_MARKER}` and "
|
|
354
363
|
"the file(s)/reason, e.g.",
|
|
355
364
|
"",
|
|
@@ -379,9 +388,29 @@ def sealed_scope_verdict_in_text(text: str | None) -> bool:
|
|
|
379
388
|
|
|
380
389
|
|
|
381
390
|
def _is_sealed_manifest_path(path: str) -> bool:
|
|
382
|
-
"""True when *path* is (any milestone's) ``manifest.yml``
|
|
383
|
-
|
|
384
|
-
|
|
391
|
+
"""True when *path* is (any milestone's) shared ``manifest.yml`` OR a
|
|
392
|
+
per-issue ``manifest.d/<issue>.(yml|yaml|json)`` fragment (#2543) — the
|
|
393
|
+
files a sealed-author conflict-fix dispatch is authorized to touch.
|
|
394
|
+
|
|
395
|
+
#2543 moves the routine per-issue `issues:`/`expected_red:` traffic out
|
|
396
|
+
of the single shared file into per-issue fragments (two different
|
|
397
|
+
fragment files can't textually conflict at all — the collision this
|
|
398
|
+
whole sealed-conflict-fix mechanism exists to resolve mostly stops
|
|
399
|
+
happening by construction going forward), but a fragment path is still
|
|
400
|
+
recognized here for completeness — a legacy single-file milestone, or a
|
|
401
|
+
same-issue retry that manages to conflict with itself, still resolves
|
|
402
|
+
the same additive way.
|
|
403
|
+
"""
|
|
404
|
+
parts = path.split("/")
|
|
405
|
+
name = parts[-1]
|
|
406
|
+
if name == SEALED_MANIFEST_FILENAME:
|
|
407
|
+
return True
|
|
408
|
+
return (
|
|
409
|
+
len(parts) >= 2
|
|
410
|
+
and parts[-2] == MANIFEST_FRAGMENTS_DIRNAME
|
|
411
|
+
and name.rsplit(".", 1)[-1] in ("yml", "yaml", "json")
|
|
412
|
+
and "." in name
|
|
413
|
+
)
|
|
385
414
|
|
|
386
415
|
|
|
387
416
|
def sealed_conflict_is_manifest_only(files: list[str]) -> bool:
|
|
@@ -259,30 +259,73 @@ def _default_fetch_repo_file(repo_github: str, path: str, branch: str) -> str |
|
|
|
259
259
|
|
|
260
260
|
|
|
261
261
|
def _fetch_manifest_data(
|
|
262
|
-
repo_github: str,
|
|
262
|
+
repo_github: str,
|
|
263
|
+
milestone_number: int,
|
|
264
|
+
branch: str,
|
|
265
|
+
fetch: ManifestFetch,
|
|
266
|
+
*,
|
|
267
|
+
issue_number: int | None = None,
|
|
263
268
|
):
|
|
269
|
+
"""*milestone_number*'s manifest data via *fetch* (a raw-content GitHub
|
|
270
|
+
fetch, no local checkout, no directory listing) — the legacy single-file
|
|
271
|
+
``manifest.(yml|yaml|json)`` (milestone-level ``gate_a:``/``exempt:``
|
|
272
|
+
blocks live here by choice, #2543), merged with *issue_number*'s own
|
|
273
|
+
``manifest.d/<issue_number>.(yml|yaml|json)`` fragment
|
|
274
|
+
(:data:`coord.acceptance.MANIFEST_FRAGMENTS_DIRNAME`) when *issue_number*
|
|
275
|
+
is given.
|
|
276
|
+
|
|
277
|
+
#2543 review: before this, only the legacy file was ever fetched here,
|
|
278
|
+
so an issue whose JIT slice was authored under the new per-issue-
|
|
279
|
+
fragment convention (``coord.test_author``'s briefing writes ONLY to
|
|
280
|
+
the fragment, never the shared file) would read back
|
|
281
|
+
``test_ids_for_issue(...) == set()`` forever — the #1138 hard gate
|
|
282
|
+
(:func:`issue_oracle_ready`) would refuse Work dispatch with "no
|
|
283
|
+
acceptance slice yet" even after the slice landed, and
|
|
284
|
+
:func:`coord.drive.AcceptanceGateChecker.has_authored_slice` (which
|
|
285
|
+
reads the same ``OracleReadiness.has_slice``) would keep believing no
|
|
286
|
+
slice was ever authored, re-dispatching a redundant ``test-author``
|
|
287
|
+
session — precisely the concurrent-JIT-authoring collision #2543 exists
|
|
288
|
+
to prevent, triggered by the fix itself. Fetching + merging the
|
|
289
|
+
fragment closes that gap. Callers that only need the milestone-level
|
|
290
|
+
blocks (:func:`gate_a_signoff_status`, which has no single issue in
|
|
291
|
+
scope) pass no *issue_number* and get exactly the legacy-only reads
|
|
292
|
+
this always did.
|
|
293
|
+
"""
|
|
264
294
|
from coord.acceptance import ( # noqa: PLC0415
|
|
265
295
|
ACCEPTANCE_DIRNAME,
|
|
296
|
+
MANIFEST_FRAGMENTS_DIRNAME,
|
|
266
297
|
ManifestData,
|
|
267
298
|
ManifestError,
|
|
299
|
+
merge_manifest_data,
|
|
268
300
|
ms_dirname,
|
|
269
301
|
parse_manifest_text,
|
|
270
302
|
)
|
|
271
303
|
|
|
304
|
+
def _fetch_one(dir_path: str, filename_stem: str) -> "ManifestData":
|
|
305
|
+
for ext in (".yml", ".yaml", ".json"):
|
|
306
|
+
path = f"{dir_path}/{filename_stem}{ext}"
|
|
307
|
+
content = fetch(repo_github, path, branch)
|
|
308
|
+
if content is None:
|
|
309
|
+
continue
|
|
310
|
+
try:
|
|
311
|
+
return parse_manifest_text(content, source=path)
|
|
312
|
+
except ManifestError:
|
|
313
|
+
# Malformed manifest degrades to "no slice authored" rather
|
|
314
|
+
# than crashing dispatch — same fail-soft posture as
|
|
315
|
+
# oracle_loop_contract_block (#945).
|
|
316
|
+
return ManifestData()
|
|
317
|
+
return ManifestData()
|
|
318
|
+
|
|
272
319
|
ms_dir = ms_dirname(milestone_number)
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
# than crashing dispatch — same fail-soft posture as
|
|
283
|
-
# oracle_loop_contract_block (#945).
|
|
284
|
-
return ManifestData()
|
|
285
|
-
return ManifestData()
|
|
320
|
+
legacy = _fetch_one(f"{ACCEPTANCE_DIRNAME}/{ms_dir}", "manifest")
|
|
321
|
+
if issue_number is None:
|
|
322
|
+
return legacy
|
|
323
|
+
|
|
324
|
+
fragment = _fetch_one(
|
|
325
|
+
f"{ACCEPTANCE_DIRNAME}/{ms_dir}/{MANIFEST_FRAGMENTS_DIRNAME}",
|
|
326
|
+
str(issue_number),
|
|
327
|
+
)
|
|
328
|
+
return merge_manifest_data(legacy, fragment)
|
|
286
329
|
|
|
287
330
|
|
|
288
331
|
def _unsupported_driver_kinds(entry: "AcceptanceDriverConfig") -> tuple[str, ...]:
|
|
@@ -522,6 +565,7 @@ def issue_oracle_ready(
|
|
|
522
565
|
|
|
523
566
|
manifest = _fetch_manifest_data(
|
|
524
567
|
repo_cfg.github, milestone_number, repo_cfg.default_branch, fetch,
|
|
568
|
+
issue_number=issue_number,
|
|
525
569
|
)
|
|
526
570
|
has_slice = bool(test_ids_for_issue(manifest.tests, issue_number))
|
|
527
571
|
exempt = issue_number in manifest.exempt or "oracle:exempt" in set(issue_labels)
|