<!-- task=m-stream-evidence-gate-core/14+13_recovery_execution plan=0 tag=RECOVERY_EXECUTION -->

# Plan - Recovery Coordinator 직렬 실행

## 배경

Arbiter가 고른 하나의 intent를 plan으로 확정한 뒤 current attempt ownership 종료, optional prepare, rebuild, budget consume, 단일 dispatch 순서로 실행하는 Core coordinator가 필요하다. filter barrier와 host/provider 책임은 섞지 않는다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/knowledge-tool-optimization-extension/milestones/stream-evidence-gate-core.md`
- Task ids: `recovery-coordinator`
- Completion mode: check-on-pass

## 분석 결과

- 읽은 파일: `parallel_evaluation.go`, `decision_arbiter.go`, `commit_boundary.go`, `stream_release.go`, `terminal.go`, `evidence_tail.go`와 관련 tests, approved SDD S04/S05/S11/S14/S23/S24.
- 새 `RecoveryCoordinator`는 request-local mutex/state로 같은 plan re-entry와 동시 cycle을 거부한다. plan 선택 뒤 bounded snapshot/cursor를 freeze하고 controller `Abort`가 성공/already-closed이기 전 preparer/rebuild/dispatch를 호출하지 않는다.
- preparer는 plan/idempotency key당 1회, deadline-bound, barrier 밖이다. 실패/timeout/cancel은 dispatch와 budget consume 없이 bounded cause terminal이다.
- rebuild 성공 뒤 `rebuilt_prompt_tokens`로 managed allowance를 최종 확정하고 0이면 dispatch 없이 terminal로 끝낸다. fault budget은 실제 outbound dispatch 직전에만 consume하며 dispatcher가 실패해도 해당 outbound attempt는 소비된다. cycle당 binding 하나만 반환한다.
- replace plan은 tail/reset, continue plan은 committed look-behind/cursor 보존 신호를 명시한다. coordinator는 endpoint error를 직렬화하지 않는다.
- 전용 coordinator tests로 ordering/call count를 검증하고 기존 classes는 최소 integration seam만 수정한다.
- `test_env=local`, platform-common profile. build/review closure true; build=`grade-boundary`, scores=`2/2/2/1/2`, loop-risk=`temporal_state,concurrent_consistency,boundary_contract`, `PLAN-cloud-G09.md`; official review=`CODE_REVIEW-cloud-G09.md`, Codex `gpt-5.6-sol` xhigh.

## 구현 체크리스트

- [ ] RECOVERY-1 eligibility·budget·re-entry를 검증하고 immutable plan을 만드는 coordinator를 구현한다.
- [ ] RECOVERY-2 abort → optional one-shot prepare → rebuild → pre-dispatch consume → single dispatch 순서를 구현한다.
- [ ] RECOVERY-3 cap 교차 소진, ordering, cancel/side-effect, preparer와 multi-cycle fixtures를 추가한다.
- [ ] RECOVERY-4 streamgate unit/race/diff 검증을 수행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 구현 항목

### [RECOVERY-1] coordinator state

- 새 `packages/go/streamgate/recovery_coordinator.go`: request policy/usage, current binding/controller, plan-key ledger와 one-cycle API를 둔다.
- `ArbitrationResult.RecoveryIntent()` 하나만 입력받고 caller cancel, commit state, terminal/tool side effect, same-plan guard, strategy/total cap을 순서대로 검사한다.

### [RECOVERY-2] serialized host calls

- controller ownership 종료가 preparer/rebuilder/dispatcher보다 먼저임을 코드 구조로 강제한다.
- preparation snapshot은 prepare 성공/실패/cancel 뒤 release하고, ingress/continuation snapshot은 request 종료 또는 handoff 시 정해진 owner만 release한다.
- dispatcher result의 actual model/provider/path/event source/controller를 immutable `AttemptBinding`으로 설치한다.

### [RECOVERY-3] tests

- 새 `recovery_coordinator_test.go`: 0/1/3, 4 rejection는 config 선행 fixture를 참조하고 strategy-total 교차, two violations single plan, bounded multi-cycle, abort failure, preparer deadline/invalid/failure-no-budget/single-call, dispatch failure/usage, re-entry, cancel/side-effect, managed trajectory를 검증한다.

## 의존 관계 및 구현 순서

`13` PASS → RECOVERY-1 → RECOVERY-2 → RECOVERY-3/4. `19`가 coordinator를 실제 gate cycle에 조립한다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| 새 `recovery_coordinator.go`, `recovery_coordinator_test.go` | RECOVERY-1/2/3 |
| `stream_release.go`, `parallel_evaluation.go` | RECOVERY-2 integration seam |

## 최종 검증

- `command -v go && readlink -f "$(command -v go)" && go version && go env GOROOT`
- `go test -count=1 ./packages/go/streamgate`
- `go test -race -count=1 ./packages/go/streamgate`
- `git diff --check`

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다.

## 이 파일을 읽는 구현 에이전트에게

구현/test/evidence만 소유한다. active pair를 유지하고 user-review/finalization/roadmap은 official reviewer/runtime에 맡긴다.
