<!-- task=m-agent-task-runtime-target-selector/11+10_unknown_isolation plan=15 tag=REVIEW_REVIEW_REFACTOR -->

# Plan - 재시작 live locator와 sibling 불변성 회귀 보강

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

구현과 검증을 끝낸 뒤 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 내용과 원문 출력으로 채운다. active 파일은 그대로 두고 review 준비 완료만 보고한다. 종결은 code-review skill 전용이다. 차단되면 정확한 원인, 시도한 명령/출력, 재개 조건만 구현 evidence에 기록한다. 사용자에게 질문하거나 user-input 도구를 호출하지 않고, control-plane stop file 생성, 다음 상태 분류, archive/log 이동, `complete.log` 또는 roadmap 수정을 하지 않는다.

## 배경

현재 재시작 테스트는 scheduler의 live locator gate와 active task에 대한 provider launch 0회를 확인한다. 그러나 독립 normal sibling을 만들지 않아 retry handoff가 consume된 뒤에도 sibling의 quota snapshot, decision, transition history가 불변이라는 S09/S11 수용 조건을 증명하지 못한다.

이번 후속은 그 deterministic regression 하나만 보강한다. production scheduler, selector 정책, quota schema와 다른 dirty 변경은 범위에서 제외한다.

## Archive Evidence Snapshot

- Prior plan: `agent-task/m-agent-task-runtime-target-selector/11+10_unknown_isolation/plan_local_G06_14.log`
- Prior review: `agent-task/m-agent-task-runtime-target-selector/11+10_unknown_isolation/code_review_cloud_G06_14.log`
- Verdict: `FAIL`
- Required: scheduler restart test가 실제 consumed handoff와 independent normal sibling의 quota/decision/transition-history JSON deep equality를 검증하지 않는다.
- Suggested: 없음
- Nit: 없음
- Affected files: `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py`
- Verification evidence: focused 3개와 selected dispatcher 20개는 PASS했다. full suite는 scope 밖 `ReviewControlTest.test_final_channel_contract_is_top_level_and_singular` 1개만 FAIL했다. `py_compile`과 `git diff --check`는 PASS했다.
- Ownership/dependency: 기존 split subtask `11+10_unknown_isolation`; predecessor `10+09_target_cap_removal`은 archived `complete.log`로 충족되었고, 신규 사용자 결정·외부 권한은 없다.
- Roadmap carryover: `throughput-policy`, SDD S06/S09/S11의 persisted continuation, scheduler invocation과 sibling snapshot 불변성을 유지한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/agent-task-runtime-target-selector.md`
- Milestone link: [Milestone 문서](agent-roadmap/phase/automation-runtime-bridge/milestones/agent-task-runtime-target-selector.md)
- Task ids:
  - `throughput-policy`: target별 정적 cap 없이 ready task dispatch와 batch quota snapshot 재사용
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py`
- `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py`
- `agent-task/m-agent-task-runtime-target-selector/11+10_unknown_isolation/plan_local_G06_14.log`
- `agent-task/m-agent-task-runtime-target-selector/11+10_unknown_isolation/code_review_cloud_G06_14.log`
- `agent-task/m-agent-task-runtime-target-selector/11+10_unknown_isolation/code_review_cloud_G07_13.log`
- `agent-roadmap/phase/automation-runtime-bridge/milestones/agent-task-runtime-target-selector.md`
- `agent-roadmap/sdd/automation-runtime-bridge/agent-task-runtime-target-selector/SDD.md`
- `agent-ops/rules/project/domain/testing/rules.md`, `agent-test/local/rules.md`, `agent-test/local/testing-smoke.md`
- `agent-task/archive/2026/07/m-agent-task-runtime-target-selector/10+09_target_cap_removal/complete.log`

### SDD 기준

- SDD는 `[승인됨]`, SDD 잠금과 Milestone 구현 잠금은 `해제`다.
- S06 `context-failover`, S09 `dispatch-integration`, S11 `throughput-policy`의 Evidence Map은 persisted handoff, scheduler invocation, independent sibling snapshot을 결정적 Python regression으로 함께 증명하도록 요구한다.
- 체크리스트는 실제 handoff consume → StateStore reopen → live gate와 sibling JSON deep-equality를 같은 test에서 묶고, 최종 검증은 focused 3개와 selected dispatcher suite로 고정한다.

### 테스트 환경 규칙

- `test_env=local`; `agent-test/local/rules.md`와 `agent-test/local/testing-smoke.md`를 읽었다.
- 이 작업은 dispatcher unit/integration simulation이다. 실제 provider CLI/session/network는 시작하지 않고 `invoke`와 `asyncio.create_subprocess_exec` deny guard를 유지한다.
- Edge-Node smoke/profile 명령은 사용자 실행 파이프라인 변경이 아니므로 의도적으로 적용하지 않는다. Python test layout이 fallback verification source이며 cached output은 허용하지 않는다.

### 테스트 커버리지 공백

- 기존 first-record와 save-fault test는 handoff identity/rollback을 덮고, 현 restart test는 live gate만 덮는다.
- 남은 공백은 actual consumed handoff와 independent normal sibling의 `quota_snapshot`, `execution_decisions`, `route_transition_history`가 reopen dispatch 전후 JSON deep-equal인 조합 회귀다.

### 심볼 참조

- renamed/removed symbol: 없음.
- 관련 경로: `StateStore.commit_retry_handoff_locator()`, `external_active_is_live()`, `dispatch_with_store()`, `invoke()`.

### 분할 판단

- 기존 `11+10_unknown_isolation` split을 유지한다. task는 하나의 test method와 하나의 scheduler-state invariant로 닫히며 API/production rollout/별도 verification slice가 없다.
- predecessor index `10`은 [complete.log](agent-task/archive/2026/07/m-agent-task-runtime-target-selector/10+09_target_cap_removal/complete.log)로 충족된다. test-only 별도 sibling은 artificial coordination만 만들므로 분리하지 않는다.

### 범위 결정 근거

- `test_dispatch.py`의 restart regression만 수정한다.
- `dispatch.py`, selector policy, quota schema, `SKILL.md`의 scope 밖 full-suite failure, 다른 active task와 unrelated dirty files는 수정하지 않는다.

### 최종 라우팅

- `evaluation_mode=isolated-reassessment`, `finalizer=finalize-task-policy.sh`, `finalizer_mode=pair`.
- build/review closures는 모두 true다: exact Required가 `test_dispatch.py:9845`에 고정되고, current checkout에서 deterministic commands를 재현했으며, testing domain/기존 split ownership/구현 잠금이 모두 명확하다.
- build scores=`1/2/1/1/1`, route_basis=`local-fit`, capability_gap=`none`; loop-risk는 temporal_state, concurrent_consistency, boundary_contract, variant_product가 matched이고 `triggered=true`다.
- review scores=`1/2/1/1/1`, route_basis=`official-review`, capability_gap=`none`.
- finalizer output: build=`PLAN-local-G06.md`, review=`CODE_REVIEW-cloud-G06.md`, official target=`codex/gpt-5.6-sol xhigh`.

## 구현 체크리스트

- [ ] 실제 `commit_retry_handoff_locator()`로 consumed handoff와 live active locator를 만든 뒤 StateStore를 close/reopen하고, `dispatch_with_store()`가 active retry task의 `invoke()`와 provider seam을 다시 호출하지 않음을 deterministic regression으로 검증한다. 같은 scheduler run 전후 independent normal sibling의 quota snapshot, worker decision, route transition history를 JSON deep-equal로 검증한다.
- [ ] existing first-record·save-fault regression과 selected dispatcher 20개를 유지하고, focused handoff/restart 3개와 full suite 결과를 실제 출력으로 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

### [REVIEW_REVIEW_REFACTOR-1] consumed handoff restart sibling regression

- 문제: `test_dispatch.py:9845`는 `t_task` 하나만 직접 pre-populate해 sibling state와 consumed handoff commit을 증명하지 못한다.
- 해결 방법:
  - retry task의 pending context와 stable handoff ID를 실제 `commit_retry_handoff_locator()`로 소비한 다음 running locator를 유지한다.
  - independent sibling에 deterministic quota/worker decision/route transition history를 기록하고 JSON snapshot을 만든다.
  - reopen scheduler에서 active retry task의 `invoke()`/provider seam 0회를 assert하고 sibling의 relevant state JSON이 snapshot과 동일함을 assert한다.
- 수정 파일 및 체크리스트:
  - [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py`: `test_retry_restart_does_not_duplicate_provider_or_mutate_sibling` fixture와 assertions를 보강한다.
- 테스트 작성: 작성. 같은 test에 retry/normal sibling fixture, stable handoff commit, reopen snapshot equality와 deny guards를 둔다.
- 중간 검증: `python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py ThroughputQuotaBatchTest.test_retry_restart_does_not_duplicate_provider_or_mutate_sibling -v` — PASS.

## 수정 파일 요약

| 파일 | 변경 항목 |
|---|---|
| `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py` | `REVIEW_REVIEW_REFACTOR-1`의 consumed-handoff/sibling restart assertions |

## 최종 검증

```bash
python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py ThroughputQuotaBatchTest.test_retry_handoff_first_locator_record_and_commit_guard ThroughputQuotaBatchTest.test_retry_handoff_production_save_fault_preserves_pending ThroughputQuotaBatchTest.test_retry_restart_does_not_duplicate_provider_or_mutate_sibling -v
python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py DynamicFailoverBudgetTest DispatcherCanonicalFailoverIntegrationTest BlockerDrainTest -v
python3 -m unittest discover -s agent-ops/skills/project/orchestrate-agent-task-loop/tests -p 'test_*.py'
python3 -m py_compile agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py
git diff --check
```

Focused/selected/compile/diff는 PASS, full suite의 scope 밖 기존 `ReviewControlTest.test_final_channel_contract_is_top_level_and_singular` 1개 실패는 원문 출력과 함께 별도 기록한다. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다.
