code-coordinator 0.5.280__tar.gz → 0.5.282__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.280 → code_coordinator-0.5.282}/PKG-INFO +1 -1
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agent.py +5 -1
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/portal.py +301 -21
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/config.py +90 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/merge_queue.py +15 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/portal_store.py +390 -1
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/portal_sync.py +150 -10
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_portal.py +279 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_decomposition_chat.py +10 -2
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_merge_queue.py +50 -4
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_portal_config.py +93 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_portal_store.py +310 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_portal_sync.py +270 -5
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.gitignore +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/CLAUDE.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/GOAL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/LICENSE +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/MANIFEST.in +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/README.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/__init__.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/audit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/block_log.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/board_service.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/brain.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/claim.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/cli.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/client.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/comments.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dao.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/db.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deps.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/drive.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/events.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/filelock.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/freshness.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/gates.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/goal.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/context.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/models.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/render.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/units.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/hooks.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/interactive.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/models.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/network.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notify.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/openapi.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/parentage.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/plans.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/progress.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/release_window.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/reports.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/review.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/self_health.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/smoke.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/split_work.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/sql.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/state.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/test_author.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/test_report.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/usage.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/install-agent.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/pyproject.toml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/setup.cfg +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/__init__.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/backends.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/conftest.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_db.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_events.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_init.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_models.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_network.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_session.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_split.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_state.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/write_parity.py +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/types/generated.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -4067,7 +4067,11 @@ composer on the client's side pauses on the most recent question only, so \
|
|
|
4067
4067
|
a scattershot list gets a partial answer at best. Then:
|
|
4068
4068
|
|
|
4069
4069
|
coord portal enqueue-question <submission_id> "<question>"
|
|
4070
|
-
|
|
4070
|
+
|
|
4071
|
+
This one command queues the question AND announces it to the customer \
|
|
4072
|
+
(#2901) — `enqueue-question` queues its own `needs-input` status right \
|
|
4073
|
+
behind the question, so there is no separate announcement step to remember \
|
|
4074
|
+
or forget.
|
|
4071
4075
|
|
|
4072
4076
|
and STOP — end your final turn summarizing the question and why, and run \
|
|
4073
4077
|
nothing else this iteration (no filing, no decisions). IL-3's consumer \
|
|
@@ -16,8 +16,16 @@ operator see and drive it without waiting for a tick:
|
|
|
16
16
|
that keeps a customer from being emailed toward an empty screen (#835);
|
|
17
17
|
* ``requeue`` revives a row the drain retired after burning its retry budget.
|
|
18
18
|
|
|
19
|
+
#2903 (phase 1 of #2902) added the gate in front of all of that — the
|
|
20
|
+
``draft`` outbox state, and with it ``drafts`` (read what is awaiting an
|
|
21
|
+
operator, in full) plus ``draft edit`` / ``draft approve`` / ``draft reject``
|
|
22
|
+
(the three ways a row leaves it). Under the default policy an agent-authored
|
|
23
|
+
``design_round`` or ``question`` cannot reach a customer without someone
|
|
24
|
+
having read it.
|
|
25
|
+
|
|
19
26
|
The state-touching commands (``sync``, ``outbox``, ``events``, ``enqueue-*``,
|
|
20
|
-
``requeue``, ``publish-mocks``, ``remirror``) read
|
|
27
|
+
``requeue``, ``drafts``, ``draft *``, ``publish-mocks``, ``remirror``) read
|
|
28
|
+
and write the daemon's own
|
|
21
29
|
``~/.coord/coord.db`` and are therefore **daemon-host commands**. Run from a
|
|
22
30
|
thin client they used to silently operate on that box's empty local DB, which
|
|
23
31
|
is not where the bridge lives — producing a normal-looking "nothing pending"
|
|
@@ -55,6 +63,8 @@ import datetime
|
|
|
55
63
|
import getpass
|
|
56
64
|
import json
|
|
57
65
|
|
|
66
|
+
from typing import TYPE_CHECKING
|
|
67
|
+
|
|
58
68
|
import click
|
|
59
69
|
|
|
60
70
|
from coord.commands._common import _CONFIG_OPTION, _load_config
|
|
@@ -65,6 +75,9 @@ from coord.portal_bridge import (
|
|
|
65
75
|
client_from_config,
|
|
66
76
|
)
|
|
67
77
|
|
|
78
|
+
if TYPE_CHECKING: # import-cycle-free type-only reference (#2903)
|
|
79
|
+
from coord.portal_store import OutboxRow
|
|
80
|
+
|
|
68
81
|
|
|
69
82
|
def _actor() -> str:
|
|
70
83
|
try:
|
|
@@ -1154,6 +1167,11 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
|
|
|
1154
1167
|
A `pending` row with a reason is HELD, not failing: the ordering guard is
|
|
1155
1168
|
refusing to announce something to the customer before the thing it
|
|
1156
1169
|
announces has been confirmed applied.
|
|
1170
|
+
|
|
1171
|
+
A `draft` row (#2903) is not queued at all yet — it is waiting for an
|
|
1172
|
+
operator to read it. Those are listed here too, so a queue that looks
|
|
1173
|
+
idle cannot secretly be a queue nobody has approved; `coord portal
|
|
1174
|
+
drafts` shows their full prose.
|
|
1157
1175
|
"""
|
|
1158
1176
|
_refuse_if_thin_client("outbox")
|
|
1159
1177
|
|
|
@@ -1167,7 +1185,10 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
|
|
|
1167
1185
|
for row in portal_store.outbox_for_submission(sub.submission_id)
|
|
1168
1186
|
]
|
|
1169
1187
|
else:
|
|
1170
|
-
rows =
|
|
1188
|
+
rows = sorted(
|
|
1189
|
+
portal_store.pending_outbox() + portal_store.draft_outbox(),
|
|
1190
|
+
key=lambda r: (r.submission_id, r.seq),
|
|
1191
|
+
)
|
|
1171
1192
|
|
|
1172
1193
|
state = portal_store.get_sync_state()
|
|
1173
1194
|
if as_json:
|
|
@@ -1223,7 +1244,13 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
|
|
|
1223
1244
|
f"{r.submission_id} seq={r.seq} rev={r.revision} "
|
|
1224
1245
|
f"{r.kind:<13} {r.state}"
|
|
1225
1246
|
)
|
|
1226
|
-
if
|
|
1247
|
+
if r.state == portal_store.STATE_DRAFT:
|
|
1248
|
+
click.secho(
|
|
1249
|
+
f"{line} DRAFT — awaiting approval "
|
|
1250
|
+
f"(`coord portal drafts` to read it)",
|
|
1251
|
+
fg="cyan",
|
|
1252
|
+
)
|
|
1253
|
+
elif held:
|
|
1227
1254
|
click.secho(f"{line} HELD — {held}", fg="yellow")
|
|
1228
1255
|
elif r.state == portal_store.STATE_REJECTED:
|
|
1229
1256
|
click.secho(f"{line} {r.reason}", fg="red")
|
|
@@ -1266,6 +1293,27 @@ def portal_events(as_json: bool, limit: int) -> None:
|
|
|
1266
1293
|
click.echo(f"{e.occurred_at or '-'} {e.submission_id} {e.kind} {e.event_id}")
|
|
1267
1294
|
|
|
1268
1295
|
|
|
1296
|
+
def _echo_enqueued(row: "OutboxRow", label: str) -> None:
|
|
1297
|
+
"""Report one just-enqueued row, saying out loud when it is gated (#2903).
|
|
1298
|
+
|
|
1299
|
+
A row that landed in `draft` has NOT been queued and will never send on
|
|
1300
|
+
its own; an operator told "queued:" for one would wait forever for an
|
|
1301
|
+
email that is sitting behind the gate they themselves have to open.
|
|
1302
|
+
"""
|
|
1303
|
+
from coord import portal_store # noqa: PLC0415
|
|
1304
|
+
|
|
1305
|
+
body = f"{row.submission_id} seq={row.seq} rev={row.revision} {label}"
|
|
1306
|
+
if row.state == portal_store.STATE_DRAFT:
|
|
1307
|
+
click.secho(
|
|
1308
|
+
f"drafted (awaiting approval): {body} — read it with "
|
|
1309
|
+
f"`coord portal drafts`, then `coord portal draft approve "
|
|
1310
|
+
f"{row.submission_id} {row.seq}`",
|
|
1311
|
+
fg="cyan",
|
|
1312
|
+
)
|
|
1313
|
+
return
|
|
1314
|
+
click.secho(f"queued: {body}", fg="green")
|
|
1315
|
+
|
|
1316
|
+
|
|
1269
1317
|
@portal_group.command("enqueue-status")
|
|
1270
1318
|
@click.argument("submission_id")
|
|
1271
1319
|
@click.argument("status", type=click.Choice(SUBMISSION_STATUSES))
|
|
@@ -1285,10 +1333,7 @@ def portal_enqueue_status(submission_id: str, status: str) -> None:
|
|
|
1285
1333
|
except PortalSyncError as exc:
|
|
1286
1334
|
click.secho(str(exc), fg="red")
|
|
1287
1335
|
raise SystemExit(1) from exc
|
|
1288
|
-
|
|
1289
|
-
f"queued: {row.submission_id} seq={row.seq} rev={row.revision} status={status}",
|
|
1290
|
-
fg="green",
|
|
1291
|
-
)
|
|
1336
|
+
_echo_enqueued(row, f"status={status}")
|
|
1292
1337
|
|
|
1293
1338
|
|
|
1294
1339
|
@portal_group.command("enqueue-design-round")
|
|
@@ -1315,10 +1360,7 @@ def portal_enqueue_design_round(submission_id: str, payload_json: str) -> None:
|
|
|
1315
1360
|
except PortalSyncError as exc:
|
|
1316
1361
|
click.secho(str(exc), fg="red")
|
|
1317
1362
|
raise SystemExit(1) from exc
|
|
1318
|
-
|
|
1319
|
-
f"queued: {row.submission_id} seq={row.seq} rev={row.revision} design_round",
|
|
1320
|
-
fg="green",
|
|
1321
|
-
)
|
|
1363
|
+
_echo_enqueued(row, "design_round")
|
|
1322
1364
|
|
|
1323
1365
|
|
|
1324
1366
|
@portal_group.command("enqueue-preview")
|
|
@@ -1341,30 +1383,31 @@ def portal_enqueue_preview(submission_id: str, preview_url: str) -> None:
|
|
|
1341
1383
|
except PortalSyncError as exc:
|
|
1342
1384
|
click.secho(str(exc), fg="red")
|
|
1343
1385
|
raise SystemExit(1) from exc
|
|
1344
|
-
|
|
1345
|
-
f"queued: {row.submission_id} seq={row.seq} rev={row.revision} preview",
|
|
1346
|
-
fg="green",
|
|
1347
|
-
)
|
|
1386
|
+
_echo_enqueued(row, "preview")
|
|
1348
1387
|
|
|
1349
1388
|
|
|
1350
1389
|
@portal_group.command("enqueue-question")
|
|
1351
1390
|
@click.argument("submission_id")
|
|
1352
1391
|
@click.argument("question")
|
|
1353
1392
|
def portal_enqueue_question(submission_id: str, question: str) -> None:
|
|
1354
|
-
"""Queue an open question for SUBMISSION_ID (sent on the next sync).
|
|
1393
|
+
"""Queue an open question for SUBMISSION_ID (sent on the next sync).
|
|
1394
|
+
|
|
1395
|
+
Also queues the `needs-input` status that announces it (#2901) — a
|
|
1396
|
+
question with no status row behind it sends no email, so this command
|
|
1397
|
+
always queues both rows in one call rather than leaving the second one
|
|
1398
|
+
to a caller who might forget it.
|
|
1399
|
+
"""
|
|
1355
1400
|
_refuse_if_thin_client("enqueue-question")
|
|
1356
1401
|
|
|
1357
1402
|
from coord.portal_sync import PortalSyncError, enqueue_question # noqa: PLC0415
|
|
1358
1403
|
|
|
1359
1404
|
try:
|
|
1360
|
-
|
|
1405
|
+
question_row, status_row = enqueue_question(submission_id, question)
|
|
1361
1406
|
except PortalSyncError as exc:
|
|
1362
1407
|
click.secho(str(exc), fg="red")
|
|
1363
1408
|
raise SystemExit(1) from exc
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
fg="green",
|
|
1367
|
-
)
|
|
1409
|
+
_echo_enqueued(question_row, "question")
|
|
1410
|
+
_echo_enqueued(status_row, "status=needs-input")
|
|
1368
1411
|
|
|
1369
1412
|
|
|
1370
1413
|
@portal_group.command("remirror")
|
|
@@ -1479,6 +1522,243 @@ def portal_requeue(submission_id: str, seq: int) -> None:
|
|
|
1479
1522
|
)
|
|
1480
1523
|
|
|
1481
1524
|
|
|
1525
|
+
# ── #2903 (phase 1 of #2902): the draft gate ────────────────────────────────
|
|
1526
|
+
#
|
|
1527
|
+
# The operator surface for the `draft` outbox state: `drafts` lists what is
|
|
1528
|
+
# waiting with the FULL PROSE (a gate you cannot read through is a
|
|
1529
|
+
# rubber-stamp), and `draft edit`/`approve`/`reject` are the three ways a row
|
|
1530
|
+
# leaves it. All four are daemon-host commands like every other
|
|
1531
|
+
# outbox-touching command — the draft rows live in the daemon's own
|
|
1532
|
+
# ~/.coord/coord.db and a thin client would silently review an empty queue.
|
|
1533
|
+
|
|
1534
|
+
|
|
1535
|
+
def _draft_field_lines(row: "OutboxRow") -> list[str]:
|
|
1536
|
+
"""The prose of one draft row, as lines, editable fields marked.
|
|
1537
|
+
|
|
1538
|
+
Prints the WHOLE payload, not just the editable slice: an operator
|
|
1539
|
+
approving a design round has to see the decomposition and bundle key
|
|
1540
|
+
they are signing off on even though neither can be rewritten here.
|
|
1541
|
+
"""
|
|
1542
|
+
from coord.portal_store import EDITABLE_DRAFT_FIELDS # noqa: PLC0415
|
|
1543
|
+
|
|
1544
|
+
editable = set(EDITABLE_DRAFT_FIELDS.get(row.kind, ()))
|
|
1545
|
+
lines: list[str] = []
|
|
1546
|
+
|
|
1547
|
+
def _walk(value, prefix: str) -> None:
|
|
1548
|
+
if isinstance(value, dict):
|
|
1549
|
+
for key in sorted(value):
|
|
1550
|
+
_walk(value[key], f"{prefix}.{key}" if prefix else key)
|
|
1551
|
+
return
|
|
1552
|
+
mark = " (editable)" if prefix in editable else ""
|
|
1553
|
+
rendered = value if isinstance(value, str) else json.dumps(value, sort_keys=True)
|
|
1554
|
+
lines.append(f" {prefix}{mark}:")
|
|
1555
|
+
for line in str(rendered).splitlines() or [""]:
|
|
1556
|
+
lines.append(f" {line}")
|
|
1557
|
+
|
|
1558
|
+
_walk(row.fields, "")
|
|
1559
|
+
return lines
|
|
1560
|
+
|
|
1561
|
+
|
|
1562
|
+
@portal_group.command("drafts")
|
|
1563
|
+
@click.option("--json", "as_json", is_flag=True, default=False)
|
|
1564
|
+
@click.argument("submission_id", required=False, default=None)
|
|
1565
|
+
def portal_drafts(as_json: bool, submission_id: str | None) -> None:
|
|
1566
|
+
"""List outbox rows awaiting operator approval, with their full prose.
|
|
1567
|
+
|
|
1568
|
+
Under the default policy (`portal.approval` in coordinator.yml) an
|
|
1569
|
+
agent-authored `design_round` or `question` lands in `draft` and no drain
|
|
1570
|
+
will ever send it. This is where you read it. Then:
|
|
1571
|
+
|
|
1572
|
+
\b
|
|
1573
|
+
coord portal draft edit <sub> <seq> rewrite the prose
|
|
1574
|
+
coord portal draft approve <sub> <seq> let it send
|
|
1575
|
+
coord portal draft reject <sub> <seq> --reason … kill it
|
|
1576
|
+
"""
|
|
1577
|
+
_refuse_if_thin_client("drafts")
|
|
1578
|
+
|
|
1579
|
+
from coord import portal_store # noqa: PLC0415
|
|
1580
|
+
|
|
1581
|
+
rows = portal_store.draft_outbox(submission_id)
|
|
1582
|
+
if as_json:
|
|
1583
|
+
click.echo(
|
|
1584
|
+
json.dumps(
|
|
1585
|
+
{
|
|
1586
|
+
"drafts": [
|
|
1587
|
+
{
|
|
1588
|
+
"submission_id": r.submission_id,
|
|
1589
|
+
"seq": r.seq,
|
|
1590
|
+
"revision": r.revision,
|
|
1591
|
+
"kind": r.kind,
|
|
1592
|
+
"state": r.state,
|
|
1593
|
+
"fields": r.fields,
|
|
1594
|
+
"enqueued_at": r.enqueued_at,
|
|
1595
|
+
}
|
|
1596
|
+
for r in rows
|
|
1597
|
+
]
|
|
1598
|
+
},
|
|
1599
|
+
indent=2,
|
|
1600
|
+
sort_keys=True,
|
|
1601
|
+
)
|
|
1602
|
+
)
|
|
1603
|
+
return
|
|
1604
|
+
|
|
1605
|
+
if not rows:
|
|
1606
|
+
click.echo("drafts: none awaiting approval")
|
|
1607
|
+
return
|
|
1608
|
+
|
|
1609
|
+
current = None
|
|
1610
|
+
for r in rows:
|
|
1611
|
+
if r.submission_id != current:
|
|
1612
|
+
current = r.submission_id
|
|
1613
|
+
click.secho(f"\n{current}", bold=True)
|
|
1614
|
+
click.secho(f" seq={r.seq} rev={r.revision} {r.kind}", fg="yellow")
|
|
1615
|
+
for line in _draft_field_lines(r):
|
|
1616
|
+
click.echo(line)
|
|
1617
|
+
click.echo(
|
|
1618
|
+
"\nApprove with `coord portal draft approve <sub> <seq>`, or reject "
|
|
1619
|
+
"with `--reason`."
|
|
1620
|
+
)
|
|
1621
|
+
|
|
1622
|
+
|
|
1623
|
+
@portal_group.group("draft")
|
|
1624
|
+
def portal_draft_group() -> None:
|
|
1625
|
+
"""Review an unapproved outbox row: edit / approve / reject (#2903)."""
|
|
1626
|
+
|
|
1627
|
+
|
|
1628
|
+
@portal_draft_group.command("edit")
|
|
1629
|
+
@click.argument("submission_id")
|
|
1630
|
+
@click.argument("seq", type=int)
|
|
1631
|
+
@click.option(
|
|
1632
|
+
"--field", "field_path", default=None,
|
|
1633
|
+
help="Which editable field to rewrite (default: the row kind's only one).",
|
|
1634
|
+
)
|
|
1635
|
+
@click.option(
|
|
1636
|
+
"--text", default=None,
|
|
1637
|
+
help="New text, instead of opening $EDITOR. Makes the command scriptable.",
|
|
1638
|
+
)
|
|
1639
|
+
def portal_draft_edit(
|
|
1640
|
+
submission_id: str, seq: int, field_path: str | None, text: str | None
|
|
1641
|
+
) -> None:
|
|
1642
|
+
"""Rewrite an editable field of a draft row in $EDITOR.
|
|
1643
|
+
|
|
1644
|
+
Only while the row is still `draft`, and only the fields that are prose:
|
|
1645
|
+
a question's text, a design round's outcome_definition. `bundle_key`,
|
|
1646
|
+
`decomposition` and `revision` are refused — they are references to
|
|
1647
|
+
things that exist, not wording. Editing a mock bundle is
|
|
1648
|
+
`coord acceptance mock --amend`.
|
|
1649
|
+
|
|
1650
|
+
Both the agent's original text and your version are appended to the
|
|
1651
|
+
submission's ledger, so `coord portal ledger` can still tell them apart
|
|
1652
|
+
six weeks from now.
|
|
1653
|
+
"""
|
|
1654
|
+
_refuse_if_thin_client("draft edit")
|
|
1655
|
+
|
|
1656
|
+
from coord import portal_store # noqa: PLC0415
|
|
1657
|
+
|
|
1658
|
+
row = portal_store.get_outbox_row(submission_id, seq)
|
|
1659
|
+
if row is None:
|
|
1660
|
+
raise click.ClickException(
|
|
1661
|
+
f"no outbox row for {submission_id} seq={seq} "
|
|
1662
|
+
f"(list them with `coord portal outbox --all`)"
|
|
1663
|
+
)
|
|
1664
|
+
editable = portal_store.EDITABLE_DRAFT_FIELDS.get(row.kind, ())
|
|
1665
|
+
if field_path is None:
|
|
1666
|
+
if len(editable) != 1:
|
|
1667
|
+
raise click.ClickException(
|
|
1668
|
+
f"a {row.kind} row has {len(editable)} editable field(s) "
|
|
1669
|
+
f"({', '.join(editable) or 'none'}) — name one with --field"
|
|
1670
|
+
)
|
|
1671
|
+
field_path = editable[0]
|
|
1672
|
+
|
|
1673
|
+
if text is None:
|
|
1674
|
+
current = portal_store.draft_field_value(row, field_path)
|
|
1675
|
+
edited = click.edit(str(current or ""))
|
|
1676
|
+
if edited is None:
|
|
1677
|
+
click.echo("unchanged — nothing written")
|
|
1678
|
+
return
|
|
1679
|
+
text = edited.strip()
|
|
1680
|
+
|
|
1681
|
+
try:
|
|
1682
|
+
updated = portal_store.edit_draft(
|
|
1683
|
+
submission_id, seq, field_path, text, actor=_actor()
|
|
1684
|
+
)
|
|
1685
|
+
except portal_store.DraftGateError as exc:
|
|
1686
|
+
raise click.ClickException(str(exc)) from exc
|
|
1687
|
+
|
|
1688
|
+
click.secho(
|
|
1689
|
+
f"edited: {updated.submission_id} seq={updated.seq} {updated.kind} "
|
|
1690
|
+
f"{field_path} (still draft — approve it to send)",
|
|
1691
|
+
fg="green",
|
|
1692
|
+
)
|
|
1693
|
+
|
|
1694
|
+
|
|
1695
|
+
@portal_draft_group.command("approve")
|
|
1696
|
+
@click.argument("submission_id")
|
|
1697
|
+
@click.argument("seq", type=int)
|
|
1698
|
+
def portal_draft_approve(submission_id: str, seq: int) -> None:
|
|
1699
|
+
"""Flip a draft row to `pending`; the next sync sends it.
|
|
1700
|
+
|
|
1701
|
+
The row keeps its seq and revision, so approving changes only whether it
|
|
1702
|
+
is eligible to send — never its place in the queue.
|
|
1703
|
+
"""
|
|
1704
|
+
_refuse_if_thin_client("draft approve")
|
|
1705
|
+
|
|
1706
|
+
from coord import portal_store # noqa: PLC0415
|
|
1707
|
+
|
|
1708
|
+
try:
|
|
1709
|
+
row = portal_store.approve_draft(submission_id, seq, actor=_actor())
|
|
1710
|
+
except portal_store.DraftGateError as exc:
|
|
1711
|
+
raise click.ClickException(str(exc)) from exc
|
|
1712
|
+
|
|
1713
|
+
click.secho(
|
|
1714
|
+
f"approved: {row.submission_id} seq={row.seq} rev={row.revision} "
|
|
1715
|
+
f"{row.kind} — now {row.state}, sends on the next `coord portal sync`",
|
|
1716
|
+
fg="green",
|
|
1717
|
+
)
|
|
1718
|
+
|
|
1719
|
+
|
|
1720
|
+
@portal_draft_group.command("reject")
|
|
1721
|
+
@click.argument("submission_id")
|
|
1722
|
+
@click.argument("seq", type=int)
|
|
1723
|
+
@click.option("--reason", required=True, help="Why. Mandatory — see #2749/#2903.")
|
|
1724
|
+
@click.option(
|
|
1725
|
+
"--no-cascade", is_flag=True, default=False,
|
|
1726
|
+
help="Refuse rather than also reject whatever announces this row.",
|
|
1727
|
+
)
|
|
1728
|
+
def portal_draft_reject(
|
|
1729
|
+
submission_id: str, seq: int, reason: str, no_cascade: bool
|
|
1730
|
+
) -> None:
|
|
1731
|
+
"""Reject a draft row. REASON is mandatory.
|
|
1732
|
+
|
|
1733
|
+
Also rejects whatever announces it. `ordering_block_reason` treats a
|
|
1734
|
+
rejected prerequisite as never-applied, so a bare reject would leave the
|
|
1735
|
+
`awaiting-signoff` / `needs-input` behind it held forever, in a state
|
|
1736
|
+
that reads like an ordinary hold. With `--no-cascade` the command
|
|
1737
|
+
refuses instead and names the rows to deal with first.
|
|
1738
|
+
"""
|
|
1739
|
+
_refuse_if_thin_client("draft reject")
|
|
1740
|
+
|
|
1741
|
+
from coord import portal_store # noqa: PLC0415
|
|
1742
|
+
|
|
1743
|
+
try:
|
|
1744
|
+
row, also = portal_store.reject_draft(
|
|
1745
|
+
submission_id, seq, reason, cascade=not no_cascade, actor=_actor()
|
|
1746
|
+
)
|
|
1747
|
+
except portal_store.DraftGateError as exc:
|
|
1748
|
+
raise click.ClickException(str(exc)) from exc
|
|
1749
|
+
|
|
1750
|
+
click.secho(
|
|
1751
|
+
f"rejected: {row.submission_id} seq={row.seq} {row.kind} — {reason}",
|
|
1752
|
+
fg="yellow",
|
|
1753
|
+
)
|
|
1754
|
+
for dep in also:
|
|
1755
|
+
click.secho(
|
|
1756
|
+
f" also rejected: seq={dep.seq} {dep.announces or dep.kind} "
|
|
1757
|
+
f"(it announced the row above and would have been held forever)",
|
|
1758
|
+
fg="yellow",
|
|
1759
|
+
)
|
|
1760
|
+
|
|
1761
|
+
|
|
1482
1762
|
# ── #2749 (IL-3, epic #2746): the running-context ledger ────────────────────
|
|
1483
1763
|
#
|
|
1484
1764
|
# `ledger` renders the four-layer briefing (issue #2749's design section —
|
|
@@ -2158,6 +2158,57 @@ class PortalProjectRepo:
|
|
|
2158
2158
|
repos: list[str]
|
|
2159
2159
|
|
|
2160
2160
|
|
|
2161
|
+
#: Every outbox row kind :mod:`coord.portal_sync` can enqueue. Duplicated
|
|
2162
|
+
#: here as literals rather than imported from ``coord.portal_sync``'s
|
|
2163
|
+
#: ``KIND_*`` constants: that module imports ``coord.portal_store`` which
|
|
2164
|
+
#: imports ``coord.db``, and config must stay importable by everything.
|
|
2165
|
+
#: ``tests/test_portal_config.py`` pins the two lists together so the copy
|
|
2166
|
+
#: cannot silently drift.
|
|
2167
|
+
PORTAL_OUTBOX_KINDS = ("status", "design_round", "question", "preview")
|
|
2168
|
+
|
|
2169
|
+
#: The draft gate's default policy (#2903, phase 1 of #2902): the two kinds
|
|
2170
|
+
#: that carry **agent-authored prose to a customer** are held for an
|
|
2171
|
+
#: operator; the two mechanical kinds are not.
|
|
2172
|
+
#:
|
|
2173
|
+
#: ``status`` and ``preview`` are deliberately ungated. A status is one of a
|
|
2174
|
+
#: pinned vocabulary and a preview is a URL — neither is prose anybody would
|
|
2175
|
+
#: read and rewrite, and gating them would produce a rubber-stamp queue of
|
|
2176
|
+
#: "In progress" ×N that trains the operator to approve without reading,
|
|
2177
|
+
#: which is the failure mode this gate exists to prevent (see epic #2902).
|
|
2178
|
+
DEFAULT_PORTAL_APPROVAL: dict[str, bool] = {
|
|
2179
|
+
"status": False,
|
|
2180
|
+
"design_round": True,
|
|
2181
|
+
"question": True,
|
|
2182
|
+
"preview": False,
|
|
2183
|
+
}
|
|
2184
|
+
|
|
2185
|
+
|
|
2186
|
+
@dataclass
|
|
2187
|
+
class PortalApprovalConfig:
|
|
2188
|
+
"""Which outbox kinds land in ``draft`` instead of ``pending`` (#2903).
|
|
2189
|
+
|
|
2190
|
+
An absent ``portal.approval`` block means :data:`DEFAULT_PORTAL_APPROVAL`
|
|
2191
|
+
exactly. A present block is **merged over** those defaults rather than
|
|
2192
|
+
replacing them, so ``approval: {question: false}`` still gates
|
|
2193
|
+
``design_round`` — an operator relaxing one kind has not silently opened
|
|
2194
|
+
every other one.
|
|
2195
|
+
"""
|
|
2196
|
+
|
|
2197
|
+
kinds: dict[str, bool] = field(
|
|
2198
|
+
default_factory=lambda: dict(DEFAULT_PORTAL_APPROVAL)
|
|
2199
|
+
)
|
|
2200
|
+
|
|
2201
|
+
def gates(self, kind: str) -> bool:
|
|
2202
|
+
"""True when *kind* must be operator-approved before it can be sent.
|
|
2203
|
+
|
|
2204
|
+
An unknown kind is **not** gated: a kind this build has never heard
|
|
2205
|
+
of cannot be one of the two prose kinds the gate is for, and failing
|
|
2206
|
+
closed on it would wedge a queue on an unrecognised row nobody can
|
|
2207
|
+
approve (there is no CLI verb for a kind that does not exist).
|
|
2208
|
+
"""
|
|
2209
|
+
return bool(self.kinds.get(kind, False))
|
|
2210
|
+
|
|
2211
|
+
|
|
2161
2212
|
@dataclass
|
|
2162
2213
|
class PortalConfig:
|
|
2163
2214
|
"""The outbound client to coord-portal's sync bridge (#2179, ``docs/CUSTOMER_PORTAL.md``).
|
|
@@ -2197,6 +2248,10 @@ class PortalConfig:
|
|
|
2197
2248
|
# a blank cell. Mapping is *operator* knowledge (which repo a client's
|
|
2198
2249
|
# project lands in), so it lives here and not in the portal's schema.
|
|
2199
2250
|
project_repos: list[PortalProjectRepo] = field(default_factory=list)
|
|
2251
|
+
# #2903 — the draft gate. Absent block == DEFAULT_PORTAL_APPROVAL ==
|
|
2252
|
+
# design_round/question held for an operator, status/preview straight
|
|
2253
|
+
# through exactly as before.
|
|
2254
|
+
approval: PortalApprovalConfig = field(default_factory=PortalApprovalConfig)
|
|
2200
2255
|
|
|
2201
2256
|
def repos_for_project(self, project_id: str) -> list[str]:
|
|
2202
2257
|
"""The coord repo name(s) *project_id* maps to — ``[]`` if unmapped.
|
|
@@ -4149,6 +4204,9 @@ def _parse_portal(raw: Any, repo_names: set[str] | None = None) -> PortalConfig:
|
|
|
4149
4204
|
if "project_repos" in raw:
|
|
4150
4205
|
cfg.project_repos = _parse_portal_project_repos(raw["project_repos"], repo_names)
|
|
4151
4206
|
|
|
4207
|
+
if "approval" in raw:
|
|
4208
|
+
cfg.approval = _parse_portal_approval(raw["approval"])
|
|
4209
|
+
|
|
4152
4210
|
if cfg.enabled and not (cfg.base_url and cfg.bridge_client_id and cfg.bridge_client_secret):
|
|
4153
4211
|
# Half a credential is not a credential — coord-portal's
|
|
4154
4212
|
# isBridgeAuthorized takes the identical position and fails closed on
|
|
@@ -4161,6 +4219,38 @@ def _parse_portal(raw: Any, repo_names: set[str] | None = None) -> PortalConfig:
|
|
|
4161
4219
|
return cfg
|
|
4162
4220
|
|
|
4163
4221
|
|
|
4222
|
+
def _parse_portal_approval(raw: Any) -> PortalApprovalConfig:
|
|
4223
|
+
"""Parse ``portal.approval`` — the draft gate's per-kind policy (#2903).
|
|
4224
|
+
|
|
4225
|
+
``None`` (key present but empty) and an absent key both mean
|
|
4226
|
+
:data:`DEFAULT_PORTAL_APPROVAL`. Anything present is merged OVER those
|
|
4227
|
+
defaults — see :class:`PortalApprovalConfig` for why merge and not
|
|
4228
|
+
replace. Every key must name a real outbox kind
|
|
4229
|
+
(:data:`PORTAL_OUTBOX_KINDS`) and every value must be a bool: a typo'd
|
|
4230
|
+
kind that parsed silently would read as "gated: no" and quietly send
|
|
4231
|
+
agent prose to a customer, which is precisely the outcome this block
|
|
4232
|
+
exists to prevent.
|
|
4233
|
+
"""
|
|
4234
|
+
if raw is None:
|
|
4235
|
+
return PortalApprovalConfig()
|
|
4236
|
+
if not isinstance(raw, dict):
|
|
4237
|
+
raise ConfigError("'portal.approval' must be a mapping of kind -> boolean")
|
|
4238
|
+
|
|
4239
|
+
unknown = sorted(set(raw) - set(PORTAL_OUTBOX_KINDS))
|
|
4240
|
+
if unknown:
|
|
4241
|
+
raise ConfigError(
|
|
4242
|
+
f"unknown portal.approval kind(s): {', '.join(unknown)} "
|
|
4243
|
+
f"(valid: {', '.join(PORTAL_OUTBOX_KINDS)})"
|
|
4244
|
+
)
|
|
4245
|
+
|
|
4246
|
+
kinds = dict(DEFAULT_PORTAL_APPROVAL)
|
|
4247
|
+
for kind, value in raw.items():
|
|
4248
|
+
if not isinstance(value, bool):
|
|
4249
|
+
raise ConfigError(f"portal.approval.{kind} must be a boolean")
|
|
4250
|
+
kinds[kind] = value
|
|
4251
|
+
return PortalApprovalConfig(kinds=kinds)
|
|
4252
|
+
|
|
4253
|
+
|
|
4164
4254
|
def _parse_portal_project_repos(
|
|
4165
4255
|
raw: Any, repo_names: set[str] | None
|
|
4166
4256
|
) -> list[PortalProjectRepo]:
|
|
@@ -6064,12 +6064,27 @@ def _maybe_push_design_round(
|
|
|
6064
6064
|
milestone_title=milestone.get("title") or f"ms-{milestone_number}",
|
|
6065
6065
|
tracking_issue_title=issue_data.get("title") or "",
|
|
6066
6066
|
tracking_issue_body=issue_data.get("body") or "",
|
|
6067
|
+
# #2903: the same Config this hook already holds, so the draft
|
|
6068
|
+
# gate's policy read does not re-resolve coordinator.yml from
|
|
6069
|
+
# disk and cannot disagree with the config this process was
|
|
6070
|
+
# started with (e.g. a `--config` override).
|
|
6071
|
+
config=config,
|
|
6067
6072
|
)
|
|
6068
6073
|
except PortalBridgeError as e:
|
|
6069
6074
|
return MergeEvent(entry, "design_round_push_failed", f"bundle upload failed: {e}")
|
|
6070
6075
|
except PortalSyncError as e:
|
|
6071
6076
|
return MergeEvent(entry, "design_round_push_failed", f"enqueue failed: {e}")
|
|
6072
6077
|
|
|
6078
|
+
if row.state == portal_store.STATE_DRAFT:
|
|
6079
|
+
# #2903: it is NOT queued — it is waiting for an operator, and an
|
|
6080
|
+
# event that says "queued" would have somebody waiting for an email
|
|
6081
|
+
# that is sitting behind a gate only they can open.
|
|
6082
|
+
return MergeEvent(
|
|
6083
|
+
entry, "design_round_drafted",
|
|
6084
|
+
f"design round for portal submission {link.submission_id} is "
|
|
6085
|
+
f"awaiting operator approval (seq={row.seq}, "
|
|
6086
|
+
f"bundle_key={bundle_key}) — `coord portal drafts`",
|
|
6087
|
+
)
|
|
6073
6088
|
return MergeEvent(
|
|
6074
6089
|
entry, "design_round_queued",
|
|
6075
6090
|
f"queued design round for portal submission {link.submission_id} "
|