code-coordinator 0.5.289__tar.gz → 0.5.290__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.289 → code_coordinator-0.5.290}/PKG-INFO +1 -1
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agent.py +76 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/portal.py +62 -8
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/decomposition_chat.py +21 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/portal_store.py +133 -1
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/serve_app.py +90 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_portal.py +121 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_decomposition_chat.py +149 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_portal_store.py +212 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_sqlite_connect_ratchet.py +13 -3
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/.gitignore +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/CLAUDE.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/GOAL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/LICENSE +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/MANIFEST.in +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/README.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/__init__.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/audit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/block_log.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/board_service.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/brain.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/claim.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/cli.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/client.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/comments.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/config.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dao.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/db.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/deps.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/drive.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/events.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/filelock.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/freshness.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/gates.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/goal.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/context.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/models.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/render.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/health/units.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/hooks.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/interactive.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/models.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/network.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/notify.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/openapi.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/parentage.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/plans.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/progress.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/release_window.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/reports.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/review.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/self_health.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/smoke.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/split_work.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/sql.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/state.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/test_author.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/test_report.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/usage.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/install-agent.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/pyproject.toml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/setup.cfg +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/__init__.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/backends.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/conftest.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_db.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_events.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_init.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_models.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_network.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_session.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_split.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_state.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tests/write_parity.py +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/types/generated.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.289 → code_coordinator-0.5.290}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -4139,6 +4139,82 @@ and report back what you asked/proposed/filed/queued/linked (and any gap) \
|
|
|
4139
4139
|
when done.\
|
|
4140
4140
|
"""
|
|
4141
4141
|
|
|
4142
|
+
# #2867: the ATTENDED posture. Appended to (never merged into)
|
|
4143
|
+
# DECOMPOSITION_CHAT_SYSTEM_PROMPT by `coord portal decompose-chat
|
|
4144
|
+
# --interactive` only — the headless dispatch
|
|
4145
|
+
# (`default_worker_command`'s `spec.type == "decomposition-chat"` branch)
|
|
4146
|
+
# must keep receiving the base prompt byte-for-byte, because it genuinely
|
|
4147
|
+
# has nobody to ask and its one-turn fire-and-forget shape is correct there.
|
|
4148
|
+
#
|
|
4149
|
+
# WHY this exists at all: #2750 shipped `--interactive` reusing the headless
|
|
4150
|
+
# prompt verbatim, so the attended session was written for an agent with
|
|
4151
|
+
# nobody to ask ("THIS iteration ends in EXACTLY ONE of three terminal
|
|
4152
|
+
# moves", each a command to run) and duly read the ledger, chose ASK, and
|
|
4153
|
+
# ran `enqueue-question` in the SAME turn — its whole output to the human
|
|
4154
|
+
# sitting there was a report of what it had already done. On a paid client
|
|
4155
|
+
# engagement where a round-trip takes days, that spent a day on questions
|
|
4156
|
+
# the operator may already have had answers to. The base prompt's
|
|
4157
|
+
# "summarize your plan before writing anything" was not enough: nothing
|
|
4158
|
+
# made it a STOP, and without a turn boundary a compliant session still
|
|
4159
|
+
# writes.
|
|
4160
|
+
DECOMPOSITION_CHAT_ATTENDED_ADDENDUM = """\
|
|
4161
|
+
|
|
4162
|
+
── ATTENDED SESSION (`--interactive`) — OVERRIDES THE ABOVE ──
|
|
4163
|
+
|
|
4164
|
+
An operator is sitting at this terminal RIGHT NOW, watching you type. That \
|
|
4165
|
+
changes the shape of this iteration, and where this section conflicts with \
|
|
4166
|
+
anything above, THIS SECTION WINS.
|
|
4167
|
+
|
|
4168
|
+
**YOUR FIRST TURN WRITES NOTHING.** Not `coord portal enqueue-question`, not \
|
|
4169
|
+
`coord portal enqueue-status`, not `coord portal decision propose/reject/\
|
|
4170
|
+
supersede`, not `coord issue create`, not `coord milestone create`, not \
|
|
4171
|
+
`coord drive-queue add`, not `coord portal link`, not `coord issue edit`. \
|
|
4172
|
+
Read-only commands (`coord portal ledger`, `gh issue view`, reading files) \
|
|
4173
|
+
are fine and expected. The "EXACTLY ONE of three terminal moves" rule above \
|
|
4174
|
+
still decides WHICH exit this iteration takes — it just does not get to \
|
|
4175
|
+
happen until the operator has answered you.
|
|
4176
|
+
|
|
4177
|
+
So your first turn is:
|
|
4178
|
+
|
|
4179
|
+
1. State your READ — the MODE line verbatim (as always), then what RUNNING \
|
|
4180
|
+
CONTEXT already tells you, explicitly including any operator-supplied \
|
|
4181
|
+
background recorded there.
|
|
4182
|
+
2. State your PROPOSED EXIT — which of Ask / Propose / Decompose you intend, \
|
|
4183
|
+
the exact command(s) you would run (question text, decision text, issue \
|
|
4184
|
+
titles), and WHY that exit and not the other two.
|
|
4185
|
+
3. State what you are ASSUMING or MISSING — above all, anything you were \
|
|
4186
|
+
about to ask the CLIENT that the OPERATOR may simply know. The operator may \
|
|
4187
|
+
have spoken to the client since the last iteration; a client round-trip \
|
|
4188
|
+
costs days and an operator answer costs one line, so ask the human in front \
|
|
4189
|
+
of you FIRST.
|
|
4190
|
+
4. END YOUR TURN AND WAIT. Do not narrate a plan and then execute it in the \
|
|
4191
|
+
same turn — the turn boundary IS the confirmation.
|
|
4192
|
+
|
|
4193
|
+
Then act on what the operator says: carry out the exit as proposed, or the \
|
|
4194
|
+
revised one they steer you to. If they confirm with no changes, run the \
|
|
4195
|
+
commands exactly as you stated them and report back. If they redirect you \
|
|
4196
|
+
into a different exit, take that one — it is still exactly one terminal \
|
|
4197
|
+
move per iteration.
|
|
4198
|
+
|
|
4199
|
+
**Recording what the operator tells you.** Background the operator relays \
|
|
4200
|
+
("I spoke to her — it's just the two of them, and the calendar is a \
|
|
4201
|
+
nice-to-have") is durable, ledger-class context that every FUTURE session on \
|
|
4202
|
+
every machine should see. It is not a decision, so do NOT push it through \
|
|
4203
|
+
`coord portal decision propose`. Record it verbatim with:
|
|
4204
|
+
|
|
4205
|
+
coord portal note <submission_id> "<what the operator told you>"
|
|
4206
|
+
|
|
4207
|
+
This is an ADDITIONAL write path you are permitted, on top of the ones the \
|
|
4208
|
+
Rules section above enumerates — and, being a write, it is also subject to \
|
|
4209
|
+
the first-turn rule: offer it, then record it once the operator agrees. \
|
|
4210
|
+
OFFER IT PROACTIVELY: the operator should not have to know this command \
|
|
4211
|
+
exists. Any time the operator gives you a substantive fact about the \
|
|
4212
|
+
client, the users, or the scope, say back what you would record and ask \
|
|
4213
|
+
whether to record it. Keep the wording theirs, not your paraphrase — the \
|
|
4214
|
+
ledger is verbatim by design, and the narrative (which is regenerable) is \
|
|
4215
|
+
where summarizing belongs.\
|
|
4216
|
+
"""
|
|
4217
|
+
|
|
4142
4218
|
# Deny list applied to decomposition-chat workers (#2533; extended #2750
|
|
4143
4219
|
# IL-4 for the ask/propose/decompose intake loop). Unlike milestone-chat,
|
|
4144
4220
|
# this type's WHOLE job is to write (issue create / issue edit / milestone
|
|
@@ -596,6 +596,7 @@ def _run_decompose_chat_interactive(
|
|
|
596
596
|
|
|
597
597
|
from coord.agent import ( # noqa: PLC0415
|
|
598
598
|
AssignmentSpec as _AssignmentSpecDc,
|
|
599
|
+
DECOMPOSITION_CHAT_ATTENDED_ADDENDUM,
|
|
599
600
|
DECOMPOSITION_CHAT_DENY_COMMANDS,
|
|
600
601
|
DECOMPOSITION_CHAT_SYSTEM_PROMPT,
|
|
601
602
|
build_deny_prompt,
|
|
@@ -664,7 +665,8 @@ def _run_decompose_chat_interactive(
|
|
|
664
665
|
if _board_service.resolve() is not None:
|
|
665
666
|
click.secho(
|
|
666
667
|
"note: this machine is a thin client — `coord portal decision`/"
|
|
667
|
-
"`ledger`/`link` route through the daemon (#2751),
|
|
668
|
+
"`ledger`/`link`/`note` route through the daemon (#2751/#2867), "
|
|
669
|
+
"but `coord "
|
|
668
670
|
"portal enqueue-question`/`enqueue-status` (the Ask move) do "
|
|
669
671
|
"not yet and will refuse loudly if this iteration needs them. "
|
|
670
672
|
"ssh to the daemon host for that case (#2750's own stated "
|
|
@@ -699,7 +701,9 @@ def _run_decompose_chat_interactive(
|
|
|
699
701
|
f"Intake session for portal submission {submission_id} "
|
|
700
702
|
f"(MODE: {mode_word} — {discuss_reason}): read the full context at "
|
|
701
703
|
f"{brief_path} (submission fields, repo topology, and the running-"
|
|
702
|
-
"context ledger so far) and let's work through it."
|
|
704
|
+
"context ledger so far) and let's work through it. This is an "
|
|
705
|
+
"ATTENDED session: state your read and your PROPOSED exit, then stop "
|
|
706
|
+
"and wait for me — write nothing until I answer (#2867)."
|
|
703
707
|
)
|
|
704
708
|
|
|
705
709
|
spec = _AssignmentSpecDc(
|
|
@@ -719,15 +723,22 @@ def _run_decompose_chat_interactive(
|
|
|
719
723
|
# internal branch table has no `"decomposition-chat"` case, so leaving
|
|
720
724
|
# it implicit would silently fall through to the generic work-shaped
|
|
721
725
|
# branch (full WORKER_SYSTEM_PROMPT + Edit/Write/Monitor), which is
|
|
722
|
-
# wrong for a no-worktree chat type.
|
|
723
|
-
#
|
|
724
|
-
#
|
|
725
|
-
#
|
|
726
|
+
# wrong for a no-worktree chat type.
|
|
727
|
+
#
|
|
728
|
+
# #2867: the attended addendum is appended HERE and only here — the
|
|
729
|
+
# headless dispatch path (`coord.agent.default_worker_command`'s own
|
|
730
|
+
# `spec.type == "decomposition-chat"` branch) keeps the base prompt
|
|
731
|
+
# byte-for-byte, so its one-turn fire-and-forget behaviour is unchanged.
|
|
732
|
+
# This session, by contrast, has a human in the pane: the addendum makes
|
|
733
|
+
# its first turn confirm-then-write (#2742's absorbed half, which #2750
|
|
734
|
+
# only ever wired into mode SELECTION, never into the posture itself).
|
|
726
735
|
argv = provider.build_command(
|
|
727
736
|
spec,
|
|
728
737
|
resolved_model=resolved_model,
|
|
729
|
-
system_prompt=
|
|
730
|
-
|
|
738
|
+
system_prompt=(
|
|
739
|
+
DECOMPOSITION_CHAT_SYSTEM_PROMPT
|
|
740
|
+
+ DECOMPOSITION_CHAT_ATTENDED_ADDENDUM
|
|
741
|
+
+ build_deny_prompt(DECOMPOSITION_CHAT_DENY_COMMANDS)
|
|
731
742
|
),
|
|
732
743
|
allowed_tools="Read,Bash",
|
|
733
744
|
)
|
|
@@ -1805,6 +1816,16 @@ def _render_ledger_text(payload: dict) -> str:
|
|
|
1805
1816
|
f"{a['text']} (by {a['actor'] or 'customer'})"
|
|
1806
1817
|
)
|
|
1807
1818
|
|
|
1819
|
+
# #2867: verbatim, attributed, in ledger seq order — its own heading so
|
|
1820
|
+
# a later session can tell operator-relayed background from something
|
|
1821
|
+
# the client actually wrote on the portal. `.get` (not `[...]`) because
|
|
1822
|
+
# a thin client may be talking to a daemon that predates this key.
|
|
1823
|
+
notes = payload.get("operator_notes") or []
|
|
1824
|
+
if notes:
|
|
1825
|
+
lines += ["", "## Operator notes"]
|
|
1826
|
+
for n in notes:
|
|
1827
|
+
lines.append(f"- [{n['seq']}] {n['text']} (by {n['actor'] or 'operator'})")
|
|
1828
|
+
|
|
1808
1829
|
lines += ["", "## Decisions"]
|
|
1809
1830
|
current = payload["decisions"]
|
|
1810
1831
|
if not current:
|
|
@@ -1861,6 +1882,39 @@ def portal_ledger(submission_id: str, as_json: bool) -> None:
|
|
|
1861
1882
|
click.echo(_render_ledger_text(payload))
|
|
1862
1883
|
|
|
1863
1884
|
|
|
1885
|
+
@portal_group.command("note")
|
|
1886
|
+
@click.argument("submission_id")
|
|
1887
|
+
@click.argument("text")
|
|
1888
|
+
def portal_note(submission_id: str, text: str) -> None:
|
|
1889
|
+
"""Record operator-supplied background about SUBMISSION_ID (#2867).
|
|
1890
|
+
|
|
1891
|
+
The ledger layer that holds what the OPERATOR knows — "spoke to the
|
|
1892
|
+
client: household of two, no logins needed" — which before this had
|
|
1893
|
+
nowhere durable to live and died with the tmux pane it was typed into.
|
|
1894
|
+
Stored verbatim on the ledger, attributed to you, and rendered into
|
|
1895
|
+
every future session's RUNNING CONTEXT on any machine.
|
|
1896
|
+
|
|
1897
|
+
Deliberately NOT `coord portal decision propose`: a relayed fact is not
|
|
1898
|
+
a judgment call, has no proposed/confirmed lifecycle, and does not
|
|
1899
|
+
belong in the decision archive.
|
|
1900
|
+
|
|
1901
|
+
Like `decision` and `link` (#2751) this is not thin-client-refused — it
|
|
1902
|
+
routes through the daemon's `/portal-note` seam when `board_service` is
|
|
1903
|
+
configured, so it works from wherever the operator happens to be.
|
|
1904
|
+
"""
|
|
1905
|
+
from coord import portal_store # noqa: PLC0415
|
|
1906
|
+
|
|
1907
|
+
try:
|
|
1908
|
+
entry = portal_store.append_operator_note(submission_id, text, actor=_actor())
|
|
1909
|
+
except ValueError as exc:
|
|
1910
|
+
click.secho(f"error: {exc}", fg="red")
|
|
1911
|
+
raise SystemExit(2) from exc
|
|
1912
|
+
click.secho(
|
|
1913
|
+
f"noted: {submission_id} #{entry.seq} (by {entry.actor}) — {entry.text}",
|
|
1914
|
+
fg="green",
|
|
1915
|
+
)
|
|
1916
|
+
|
|
1917
|
+
|
|
1864
1918
|
@portal_group.group("decision")
|
|
1865
1919
|
def portal_decision_group() -> None:
|
|
1866
1920
|
"""Propose / confirm / reject / supersede a decision (#2749).
|
|
@@ -278,6 +278,11 @@ def render_running_context_section(payload: dict[str, Any]) -> str:
|
|
|
278
278
|
ones carrying why), and the current narrative. This is what lets a
|
|
279
279
|
fresh iteration pick up exactly where the last one left off with no
|
|
280
280
|
memory of the prior session (#2750's "the loop").
|
|
281
|
+
|
|
282
|
+
Since #2867 it also renders the ledger's operator-note layer — what a
|
|
283
|
+
human relayed out of band ("I spoke to her; it's just the two of them")
|
|
284
|
+
— attributed as operator-supplied so a session can tell it from
|
|
285
|
+
something the client wrote on the portal itself.
|
|
281
286
|
"""
|
|
282
287
|
lines: list[str] = ["RUNNING CONTEXT (from the portal ledger):", "", "Q&A so far:"]
|
|
283
288
|
qa = payload.get("qa") or []
|
|
@@ -301,6 +306,22 @@ def render_running_context_section(payload: dict[str, Any]) -> str:
|
|
|
301
306
|
f"{a.get('text', '')} (by {a.get('actor') or 'customer'})"
|
|
302
307
|
)
|
|
303
308
|
|
|
309
|
+
# #2867: verbatim and attributed, so a session on a different machine
|
|
310
|
+
# with no shared transcript still sees what the operator was told out of
|
|
311
|
+
# band. Placed ahead of decisions because it is INPUT to them.
|
|
312
|
+
notes = payload.get("operator_notes") or []
|
|
313
|
+
if notes:
|
|
314
|
+
lines.append("")
|
|
315
|
+
lines.append(
|
|
316
|
+
"Operator-supplied background (relayed by a human, NOT written by "
|
|
317
|
+
"the client on the portal — treat as fact, do not re-ask it):"
|
|
318
|
+
)
|
|
319
|
+
for n in notes:
|
|
320
|
+
lines.append(
|
|
321
|
+
f" - [{n.get('seq')}] {n.get('text')} "
|
|
322
|
+
f"(by {n.get('actor') or 'operator'})"
|
|
323
|
+
)
|
|
324
|
+
|
|
304
325
|
lines.append("")
|
|
305
326
|
lines.append("Current decisions (proposed/confirmed — treat as live guidance):")
|
|
306
327
|
current = payload.get("decisions") or []
|
|
@@ -1739,6 +1739,44 @@ LEDGER_KIND_DRAFT_EDITED = "draft_edited"
|
|
|
1739
1739
|
LEDGER_KIND_DRAFT_APPROVED = "draft_approved"
|
|
1740
1740
|
LEDGER_KIND_DRAFT_REJECTED = "draft_rejected"
|
|
1741
1741
|
|
|
1742
|
+
#: #2867: background the OPERATOR relays — "I spoke to her; it's just the two
|
|
1743
|
+
#: of them and the calendar is a nice-to-have." Ledger-class, not
|
|
1744
|
+
#: decision-class: it is a FACT someone told the operator, not a judgment
|
|
1745
|
+
#: call with a proposed/confirmed lifecycle, so forcing it through
|
|
1746
|
+
#: `coord portal decision propose` would both lose the raw statement and
|
|
1747
|
+
#: pollute the decision archive. Still coord-observed in the sense this
|
|
1748
|
+
#: section's ownership note means — a human typed it at coord's own CLI,
|
|
1749
|
+
#: which is not "an agent's say-so about a fact it does not solely observe".
|
|
1750
|
+
#: Stored VERBATIM and never folded into the narrative (#2746: "a ledger that
|
|
1751
|
+
#: IS a narrative cannot be regenerated — that asymmetry is the design").
|
|
1752
|
+
LEDGER_KIND_OPERATOR_NOTE = "operator_note"
|
|
1753
|
+
|
|
1754
|
+
#: Marks a ledger ``actor`` as a human at coord's CLI rather than the portal
|
|
1755
|
+
#: wire, so a later session can tell operator-relayed context from something
|
|
1756
|
+
#: the client actually wrote. See :func:`operator_actor`.
|
|
1757
|
+
OPERATOR_ACTOR_PREFIX = "operator:"
|
|
1758
|
+
|
|
1759
|
+
|
|
1760
|
+
def operator_actor(name: str = "") -> str:
|
|
1761
|
+
"""The ``actor`` string for an operator-authored ledger row.
|
|
1762
|
+
|
|
1763
|
+
``"jane"`` → ``"operator:jane"``; empty → the bare ``"operator"``. Already
|
|
1764
|
+
prefixed values pass through unchanged, so routing a note through the
|
|
1765
|
+
daemon (which re-normalizes) can't produce ``operator:operator:jane``.
|
|
1766
|
+
"""
|
|
1767
|
+
n = (name or "").strip()
|
|
1768
|
+
if not n:
|
|
1769
|
+
return "operator"
|
|
1770
|
+
return n if n.startswith(OPERATOR_ACTOR_PREFIX) else f"{OPERATOR_ACTOR_PREFIX}{n}"
|
|
1771
|
+
|
|
1772
|
+
|
|
1773
|
+
def is_operator_actor(actor: str) -> bool:
|
|
1774
|
+
"""True when *actor* names a human at coord's CLI (:func:`operator_actor`'s
|
|
1775
|
+
output) rather than the customer or an agent — what the briefing renders
|
|
1776
|
+
attribute notes with."""
|
|
1777
|
+
a = (actor or "").strip()
|
|
1778
|
+
return a == "operator" or a.startswith(OPERATOR_ACTOR_PREFIX)
|
|
1779
|
+
|
|
1742
1780
|
|
|
1743
1781
|
@dataclass(frozen=True)
|
|
1744
1782
|
class LedgerEntry:
|
|
@@ -1870,6 +1908,79 @@ def ledger_for_submission(submission_id: str) -> list[LedgerEntry]:
|
|
|
1870
1908
|
return [_ledger_from_row(r) for r in rows]
|
|
1871
1909
|
|
|
1872
1910
|
|
|
1911
|
+
def operator_notes_for_submission(submission_id: str) -> list[LedgerEntry]:
|
|
1912
|
+
"""*submission_id*'s operator notes (#2867), oldest first — the ledger
|
|
1913
|
+
rows a human typed, filtered out of :func:`ledger_for_submission`'s full
|
|
1914
|
+
history by kind."""
|
|
1915
|
+
return [
|
|
1916
|
+
e
|
|
1917
|
+
for e in ledger_for_submission(submission_id)
|
|
1918
|
+
if e.kind == LEDGER_KIND_OPERATOR_NOTE
|
|
1919
|
+
]
|
|
1920
|
+
|
|
1921
|
+
|
|
1922
|
+
def _append_operator_note_local(
|
|
1923
|
+
submission_id: str, text: str, *, actor: str = "", now: float | None = None
|
|
1924
|
+
) -> LedgerEntry:
|
|
1925
|
+
"""Write half of :func:`append_operator_note` — runs on the daemon host
|
|
1926
|
+
(either directly, or via ``/portal-note`` on behalf of a thin client).
|
|
1927
|
+
|
|
1928
|
+
Validates the submission EXISTS here rather than in the CLI: on a thin
|
|
1929
|
+
client the local ``portal_submissions`` table is empty by construction
|
|
1930
|
+
(#2336), so a caller-side check would reject every id. Doing it here
|
|
1931
|
+
means the "unknown submission" error is raised where the real table
|
|
1932
|
+
lives, whichever machine the operator typed the command on.
|
|
1933
|
+
"""
|
|
1934
|
+
if not submission_id or not submission_id.strip():
|
|
1935
|
+
raise ValueError("operator note needs a submission_id")
|
|
1936
|
+
if not text or not text.strip():
|
|
1937
|
+
raise ValueError("operator note needs non-empty text")
|
|
1938
|
+
if get_submission(submission_id) is None:
|
|
1939
|
+
raise ValueError(
|
|
1940
|
+
f"unknown submission {submission_id!r} — no portal submission with "
|
|
1941
|
+
"that id (check `coord portal status` for the current ids)"
|
|
1942
|
+
)
|
|
1943
|
+
return append_ledger_entry(
|
|
1944
|
+
submission_id,
|
|
1945
|
+
LEDGER_KIND_OPERATOR_NOTE,
|
|
1946
|
+
text=text.strip(),
|
|
1947
|
+
actor=operator_actor(actor),
|
|
1948
|
+
now=now,
|
|
1949
|
+
)
|
|
1950
|
+
|
|
1951
|
+
|
|
1952
|
+
def _route_note(payload: dict[str, Any]) -> dict[str, Any] | None:
|
|
1953
|
+
"""POST *payload* to the daemon's ``/portal-note`` seam, or ``None`` if
|
|
1954
|
+
this process IS the daemon host — the note-shaped twin of
|
|
1955
|
+
:func:`_route_decision`, and daemon-routed for exactly the same reason
|
|
1956
|
+
(#2751): the operator may be sitting at any machine in the fleet, and a
|
|
1957
|
+
note written into a thin client's own empty DB would be silently lost.
|
|
1958
|
+
"""
|
|
1959
|
+
from coord import board_service # noqa: PLC0415
|
|
1960
|
+
|
|
1961
|
+
svc = board_service.resolve()
|
|
1962
|
+
return board_service.route_write(svc, "/portal-note", payload)
|
|
1963
|
+
|
|
1964
|
+
|
|
1965
|
+
def append_operator_note(
|
|
1966
|
+
submission_id: str, text: str, *, actor: str = "", now: float | None = None
|
|
1967
|
+
) -> LedgerEntry:
|
|
1968
|
+
"""Append one operator-supplied background fact to *submission_id*'s
|
|
1969
|
+
ledger (#2867) — routed to the daemon when ``board_service`` is
|
|
1970
|
+
configured, else written locally.
|
|
1971
|
+
|
|
1972
|
+
Raises :class:`ValueError` for an unknown submission, empty text, or a
|
|
1973
|
+
missing id. The stored text is VERBATIM (stripped of surrounding
|
|
1974
|
+
whitespace only) and is never rewritten into the narrative.
|
|
1975
|
+
"""
|
|
1976
|
+
routed = _route_note(
|
|
1977
|
+
{"submission_id": submission_id, "text": text, "actor": actor}
|
|
1978
|
+
)
|
|
1979
|
+
if routed is not None:
|
|
1980
|
+
return _ledger_from_row(routed["entry"])
|
|
1981
|
+
return _append_operator_note_local(submission_id, text, actor=actor, now=now)
|
|
1982
|
+
|
|
1983
|
+
|
|
1873
1984
|
# ── layer 2: decisions (agent-authored, operator-confirmed) ─────────────────
|
|
1874
1985
|
|
|
1875
1986
|
DECISION_PROPOSED = "proposed"
|
|
@@ -2208,6 +2319,11 @@ def render_ledger_payload(submission_id: str) -> dict[str, Any]:
|
|
|
2208
2319
|
:func:`coord.portal_sync._record_question_answer` never drops one just
|
|
2209
2320
|
because it can't be paired) lands in ``unpaired_answers`` instead of
|
|
2210
2321
|
being silently lost.
|
|
2322
|
+
|
|
2323
|
+
Operator notes (#2867) come back verbatim under their own
|
|
2324
|
+
``operator_notes`` key, in ledger ``seq`` order — deliberately NOT mixed
|
|
2325
|
+
into ``qa`` (they answer no question) and NOT folded into ``narrative``
|
|
2326
|
+
(they are ledger-class facts, and the narrative is regenerable).
|
|
2211
2327
|
"""
|
|
2212
2328
|
ledger = ledger_for_submission(submission_id)
|
|
2213
2329
|
decisions = decisions_for_submission(submission_id)
|
|
@@ -2215,8 +2331,11 @@ def render_ledger_payload(submission_id: str) -> dict[str, Any]:
|
|
|
2215
2331
|
|
|
2216
2332
|
questions: dict[int | None, dict[str, Any]] = {}
|
|
2217
2333
|
unpaired_answers: list[LedgerEntry] = []
|
|
2334
|
+
operator_notes: list[LedgerEntry] = []
|
|
2218
2335
|
for entry in ledger:
|
|
2219
|
-
if entry.kind ==
|
|
2336
|
+
if entry.kind == LEDGER_KIND_OPERATOR_NOTE:
|
|
2337
|
+
operator_notes.append(entry)
|
|
2338
|
+
elif entry.kind == LEDGER_KIND_QUESTION_PUSHED:
|
|
2220
2339
|
questions.setdefault(
|
|
2221
2340
|
entry.question_revision, {"question": entry, "answers": []}
|
|
2222
2341
|
)
|
|
@@ -2252,6 +2371,19 @@ def render_ledger_payload(submission_id: str) -> dict[str, Any]:
|
|
|
2252
2371
|
}
|
|
2253
2372
|
for a in unpaired_answers
|
|
2254
2373
|
],
|
|
2374
|
+
# #2867: verbatim, in ledger `seq` order (`ledger_for_submission` is
|
|
2375
|
+
# seq-ordered and this list preserves that), carrying the operator
|
|
2376
|
+
# `actor` so every renderer can attribute them rather than letting
|
|
2377
|
+
# them read as something the client said.
|
|
2378
|
+
"operator_notes": [
|
|
2379
|
+
{
|
|
2380
|
+
"seq": n.seq,
|
|
2381
|
+
"text": n.text,
|
|
2382
|
+
"actor": n.actor,
|
|
2383
|
+
"recorded_at": n.recorded_at,
|
|
2384
|
+
}
|
|
2385
|
+
for n in operator_notes
|
|
2386
|
+
],
|
|
2255
2387
|
"decisions": [
|
|
2256
2388
|
{
|
|
2257
2389
|
"seq": d.seq,
|
|
@@ -3283,6 +3283,41 @@ def openapi_spec() -> dict:
|
|
|
3283
3283
|
},
|
|
3284
3284
|
},
|
|
3285
3285
|
},
|
|
3286
|
+
"/portal-note": {
|
|
3287
|
+
"post": {
|
|
3288
|
+
"summary": (
|
|
3289
|
+
"#2867: append one operator-supplied background fact to a "
|
|
3290
|
+
"submission's ledger, verbatim — the layer that holds what "
|
|
3291
|
+
"the OPERATOR knows (e.g. relayed from a phone call). "
|
|
3292
|
+
"Executed HERE on the daemon, same reason /portal-decision "
|
|
3293
|
+
"is — `coord portal note`"
|
|
3294
|
+
),
|
|
3295
|
+
"requestBody": {
|
|
3296
|
+
"required": True,
|
|
3297
|
+
"content": {
|
|
3298
|
+
"application/json": {
|
|
3299
|
+
"schema": {
|
|
3300
|
+
"type": "object",
|
|
3301
|
+
"properties": {
|
|
3302
|
+
"submission_id": {"type": "string"},
|
|
3303
|
+
"text": {"type": "string"},
|
|
3304
|
+
"actor": {"type": "string"},
|
|
3305
|
+
},
|
|
3306
|
+
"required": ["submission_id", "text"],
|
|
3307
|
+
}
|
|
3308
|
+
}
|
|
3309
|
+
},
|
|
3310
|
+
},
|
|
3311
|
+
"responses": {
|
|
3312
|
+
"200": {"description": "OK — {'entry': <serialized LedgerEntry>}"},
|
|
3313
|
+
"400": {
|
|
3314
|
+
"description": (
|
|
3315
|
+
"Missing submission_id, empty text, or unknown submission"
|
|
3316
|
+
)
|
|
3317
|
+
},
|
|
3318
|
+
},
|
|
3319
|
+
},
|
|
3320
|
+
},
|
|
3286
3321
|
"/portal-ledger": {
|
|
3287
3322
|
"get": {
|
|
3288
3323
|
"summary": (
|
|
@@ -6191,6 +6226,60 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
|
|
|
6191
6226
|
}
|
|
6192
6227
|
)
|
|
6193
6228
|
|
|
6229
|
+
async def post_portal_note(request: Request) -> Response:
|
|
6230
|
+
# #2867: the ledger's operator-context layer. Same seam shape and
|
|
6231
|
+
# same rationale as `/portal-decision` right above (#2751) — the
|
|
6232
|
+
# operator relaying what a client told them may be sitting at any
|
|
6233
|
+
# machine in the fleet, and a note written into a thin client's own
|
|
6234
|
+
# empty `portal_ledger` would be silently lost. The unknown-
|
|
6235
|
+
# submission check lives in `_append_operator_note_local`, i.e. HERE
|
|
6236
|
+
# where the real `portal_submissions` table is, and surfaces as a
|
|
6237
|
+
# 400 through the same ValueError branch.
|
|
6238
|
+
import json as _json # noqa: PLC0415
|
|
6239
|
+
|
|
6240
|
+
from coord import portal_store # noqa: PLC0415
|
|
6241
|
+
|
|
6242
|
+
body = await _read_json(request)
|
|
6243
|
+
if body is None:
|
|
6244
|
+
return JSONResponse({"error": "invalid JSON body"}, status_code=400)
|
|
6245
|
+
submission_id = body.get("submission_id")
|
|
6246
|
+
if not isinstance(submission_id, str) or not submission_id:
|
|
6247
|
+
return JSONResponse(
|
|
6248
|
+
{"error": "portal-note needs a 'submission_id'"}, status_code=400
|
|
6249
|
+
)
|
|
6250
|
+
try:
|
|
6251
|
+
entry = portal_store._append_operator_note_local(
|
|
6252
|
+
submission_id,
|
|
6253
|
+
body.get("text") or "",
|
|
6254
|
+
actor=body.get("actor") or "",
|
|
6255
|
+
)
|
|
6256
|
+
except ValueError as e:
|
|
6257
|
+
return JSONResponse({"error": f"bad portal-note: {e}"}, status_code=400)
|
|
6258
|
+
except Exception as e: # noqa: BLE001
|
|
6259
|
+
return JSONResponse(
|
|
6260
|
+
{"error": "portal-note write failed", "detail": str(e)},
|
|
6261
|
+
status_code=503,
|
|
6262
|
+
)
|
|
6263
|
+
return JSONResponse(
|
|
6264
|
+
{
|
|
6265
|
+
"entry": {
|
|
6266
|
+
"id": entry.id,
|
|
6267
|
+
"submission_id": entry.submission_id,
|
|
6268
|
+
"seq": entry.seq,
|
|
6269
|
+
"kind": entry.kind,
|
|
6270
|
+
"question_revision": entry.question_revision,
|
|
6271
|
+
"text": entry.text,
|
|
6272
|
+
"actor": entry.actor,
|
|
6273
|
+
"source_event_id": entry.source_event_id,
|
|
6274
|
+
# `_ledger_from_row` (which the client feeds this dict
|
|
6275
|
+
# back into) parses this key as a JSON *string*, exactly
|
|
6276
|
+
# as it comes off a DB row — not as a nested object.
|
|
6277
|
+
"payload_json": _json.dumps(entry.payload, sort_keys=True),
|
|
6278
|
+
"recorded_at": entry.recorded_at,
|
|
6279
|
+
}
|
|
6280
|
+
}
|
|
6281
|
+
)
|
|
6282
|
+
|
|
6194
6283
|
async def get_portal_ledger(request: Request) -> Response:
|
|
6195
6284
|
# #2749 (IL-3): render one submission's running-context briefing on
|
|
6196
6285
|
# the daemon and hand back the same JSON shape
|
|
@@ -9482,6 +9571,7 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
|
|
|
9482
9571
|
Route("/portal-link", get_portal_link, methods=["GET"]),
|
|
9483
9572
|
Route("/portal-link", post_portal_link, methods=["POST"]),
|
|
9484
9573
|
Route("/portal-decision", post_portal_decision, methods=["POST"]),
|
|
9574
|
+
Route("/portal-note", post_portal_note, methods=["POST"]),
|
|
9485
9575
|
Route("/portal-ledger", get_portal_ledger, methods=["GET"]),
|
|
9486
9576
|
Route("/dispatched", post_dispatched, methods=["POST"]),
|
|
9487
9577
|
Route("/test-verdict", post_test_verdict, methods=["POST"]),
|
|
@@ -1775,3 +1775,124 @@ def test_a_configured_ungated_kind_queues_straight_through(tmp_path, monkeypatch
|
|
|
1775
1775
|
|
|
1776
1776
|
assert [r.seq for r in portal_store.pending_outbox()] == [1, 2]
|
|
1777
1777
|
assert portal_store.draft_outbox() == []
|
|
1778
|
+
|
|
1779
|
+
|
|
1780
|
+
# ── #2867: `coord portal note` — the ledger's operator-context layer ─────────
|
|
1781
|
+
|
|
1782
|
+
|
|
1783
|
+
def test_note_is_registered_on_the_portal_group():
|
|
1784
|
+
result = run("portal", "--help")
|
|
1785
|
+
assert result.exit_code == 0
|
|
1786
|
+
assert "note" in result.output
|
|
1787
|
+
|
|
1788
|
+
|
|
1789
|
+
def test_note_records_operator_background_verbatim_and_attributed(monkeypatch):
|
|
1790
|
+
"""The headline #2867 behaviour: what the operator knows gets a durable
|
|
1791
|
+
home on the ledger, stored exactly as typed and attributed to a human."""
|
|
1792
|
+
from coord import portal_store
|
|
1793
|
+
|
|
1794
|
+
portal_store.seed_revision("sub_1", 1)
|
|
1795
|
+
monkeypatch.setattr("coord.commands.portal._actor", lambda: "jane")
|
|
1796
|
+
|
|
1797
|
+
text = (
|
|
1798
|
+
"Spoke to client 2026-08-28: household of two, no logins needed; "
|
|
1799
|
+
"calendar is a nice-to-have."
|
|
1800
|
+
)
|
|
1801
|
+
result = run("portal", "note", "sub_1", text)
|
|
1802
|
+
assert result.exit_code == 0, result.output
|
|
1803
|
+
assert "noted: sub_1 #1" in result.output
|
|
1804
|
+
|
|
1805
|
+
[entry] = portal_store.operator_notes_for_submission("sub_1")
|
|
1806
|
+
assert entry.text == text # verbatim — not summarized, not reworded
|
|
1807
|
+
assert entry.actor == "operator:jane"
|
|
1808
|
+
assert entry.kind == portal_store.LEDGER_KIND_OPERATOR_NOTE
|
|
1809
|
+
|
|
1810
|
+
|
|
1811
|
+
def test_note_rejects_an_unknown_submission_with_a_clear_error():
|
|
1812
|
+
from coord import portal_store
|
|
1813
|
+
|
|
1814
|
+
result = run("portal", "note", "sub_nope", "background")
|
|
1815
|
+
assert result.exit_code == 2
|
|
1816
|
+
assert "unknown submission" in result.output
|
|
1817
|
+
assert "sub_nope" in result.output
|
|
1818
|
+
assert portal_store.ledger_for_submission("sub_nope") == []
|
|
1819
|
+
|
|
1820
|
+
|
|
1821
|
+
def test_note_rejects_empty_text():
|
|
1822
|
+
from coord import portal_store
|
|
1823
|
+
|
|
1824
|
+
portal_store.seed_revision("sub_1", 1)
|
|
1825
|
+
result = run("portal", "note", "sub_1", " ")
|
|
1826
|
+
assert result.exit_code == 2
|
|
1827
|
+
assert "non-empty" in result.output
|
|
1828
|
+
assert portal_store.ledger_for_submission("sub_1") == []
|
|
1829
|
+
|
|
1830
|
+
|
|
1831
|
+
def test_ledger_renders_operator_notes_attributed_and_in_seq_order(monkeypatch):
|
|
1832
|
+
"""#2867's acceptance bar for the read side: `coord portal ledger` shows
|
|
1833
|
+
the note verbatim, under its own heading, attributed — and never as a
|
|
1834
|
+
decision."""
|
|
1835
|
+
from coord import portal_store
|
|
1836
|
+
|
|
1837
|
+
portal_store.seed_revision("sub_1", 1)
|
|
1838
|
+
monkeypatch.setattr("coord.commands.portal._actor", lambda: "jane")
|
|
1839
|
+
run("portal", "note", "sub_1", "Household of two.")
|
|
1840
|
+
run("portal", "note", "sub_1", "Calendar is a nice-to-have.")
|
|
1841
|
+
|
|
1842
|
+
result = run("portal", "ledger", "sub_1")
|
|
1843
|
+
assert result.exit_code == 0, result.output
|
|
1844
|
+
assert "## Operator notes" in result.output
|
|
1845
|
+
assert "[1] Household of two. (by operator:jane)" in result.output
|
|
1846
|
+
assert "[2] Calendar is a nice-to-have. (by operator:jane)" in result.output
|
|
1847
|
+
# Order is ledger seq order, notes never leak into the Decisions layer.
|
|
1848
|
+
assert result.output.index("Household of two.") < result.output.index(
|
|
1849
|
+
"Calendar is a nice-to-have."
|
|
1850
|
+
)
|
|
1851
|
+
decisions_section = result.output.split("## Decisions", 1)[1]
|
|
1852
|
+
assert "Household of two." not in decisions_section
|
|
1853
|
+
|
|
1854
|
+
as_json = run("portal", "ledger", "sub_1", "--json")
|
|
1855
|
+
assert as_json.exit_code == 0, as_json.output
|
|
1856
|
+
payload = json.loads(as_json.output)
|
|
1857
|
+
assert [n["text"] for n in payload["operator_notes"]] == [
|
|
1858
|
+
"Household of two.",
|
|
1859
|
+
"Calendar is a nice-to-have.",
|
|
1860
|
+
]
|
|
1861
|
+
assert payload["decisions"] == []
|
|
1862
|
+
assert payload["narrative"] == ""
|
|
1863
|
+
|
|
1864
|
+
|
|
1865
|
+
def test_note_routes_through_the_daemon_on_a_thin_client(thin_client, monkeypatch):
|
|
1866
|
+
"""Same #2751 exception `decision`/`ledger`/`link` get: the operator may
|
|
1867
|
+
be sitting anywhere in the fleet, so this must POST `/portal-note`
|
|
1868
|
+
rather than write a thin client's own (empty, wrong) local DB."""
|
|
1869
|
+
from coord import client as cc
|
|
1870
|
+
|
|
1871
|
+
calls = []
|
|
1872
|
+
|
|
1873
|
+
def _fake_post_record(svc, path, payload, **kw):
|
|
1874
|
+
calls.append((path, payload))
|
|
1875
|
+
return {
|
|
1876
|
+
"entry": {
|
|
1877
|
+
"id": 1,
|
|
1878
|
+
"submission_id": payload["submission_id"],
|
|
1879
|
+
"seq": 7,
|
|
1880
|
+
"kind": "operator_note",
|
|
1881
|
+
"question_revision": None,
|
|
1882
|
+
"text": payload["text"],
|
|
1883
|
+
"actor": "operator:jane",
|
|
1884
|
+
"source_event_id": None,
|
|
1885
|
+
"payload_json": "{}",
|
|
1886
|
+
"recorded_at": 100.0,
|
|
1887
|
+
}
|
|
1888
|
+
}
|
|
1889
|
+
|
|
1890
|
+
monkeypatch.setattr(cc, "post_record", _fake_post_record)
|
|
1891
|
+
|
|
1892
|
+
result = run("portal", "note", "sub_1", "Client prefers web-only")
|
|
1893
|
+
assert result.exit_code == 0, result.output
|
|
1894
|
+
assert "noted: sub_1 #7" in result.output
|
|
1895
|
+
assert len(calls) == 1
|
|
1896
|
+
assert calls[0][0] == "/portal-note"
|
|
1897
|
+
assert calls[0][1]["submission_id"] == "sub_1"
|
|
1898
|
+
assert calls[0][1]["text"] == "Client prefers web-only"
|