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

# Code Review Reference - REVIEW_REFACTOR

> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> The task is NOT complete until every implementation-owned section below is filled in.
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
> If implementation is blocked, record the exact blocker, attempted commands/output, and resume condition only in implementation-owned evidence fields.
> Do not ask the user directly, present choices, call user-input tools, create control-plane stop files, or classify the next state.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
> Follow the ownership table at the bottom of this file for which sections you own.

## 개요

date=2026-07-27
task=m-agent-task-runtime-target-selector/11+10_unknown_isolation, plan=14, tag=REVIEW_REFACTOR

## 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

## Archive Evidence Snapshot

- Prior plan: `agent-task/m-agent-task-runtime-target-selector/11+10_unknown_isolation/plan_local_G08_13.log`
- Prior review: `agent-task/m-agent-task-runtime-target-selector/11+10_unknown_isolation/code_review_cloud_G07_13.log`
- Verdict: `FAIL`
- Required: restart 회귀가 scheduler live-locator gate를 우회해 provider seam 2회를 허용하므로 추가 launch 0회를 증명하지 못한다.
- 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개가 현재 수정 중인 `SKILL.md`의 ``final`` 표기 때문에 FAIL한다. `py_compile`과 `git diff --check`는 PASS했다.
- Ownership/dependency: 기존 split subtask `11+10_unknown_isolation`과 testing domain 소유이며, 신규 predecessor·사용자 결정·외부 권한은 없다.
- Roadmap carryover: `throughput-policy`, SDD S06/S09/S11의 persisted continuation, dispatch integration, sibling quota snapshot 불변성을 유지한다.

## 이 파일을 읽는 리뷰 에이전트에게

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.

1. 판정을 append한다.
2. `CODE_REVIEW-cloud-G06.md` → `code_review_cloud_G06_14.log`, `PLAN-local-G06.md` → `plan_local_G06_14.log`로 아카이브한다.
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-agent-task-runtime-target-selector/11+10_unknown_isolation/`로 이동한다. WARN/FAIL이면 code-review skill이 요구하는 다음 filesystem state를 완전히 작성한다.
4. PASS이고 task group이 `m-agent-task-runtime-target-selector`이므로 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| REVIEW_REFACTOR-1 scheduler live locator restart regression | [x] |

## 구현 체크리스트

- [x] StateStore close/reopen 뒤 `dispatch_with_store()`가 active worker의 live locator를 external-active로 분류해 `run_worker()`와 provider subprocess seam을 다시 호출하지 않음을 deterministic regression으로 검증한다.
- [x] retry handoff가 이미 한 번 consume된 상태와 independent normal sibling의 quota/decision/transition history deep equality를 restart 전후로 검증하고, first-record·save-fault regression을 유지한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 코드리뷰 전용 체크리스트

> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G06_14.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_local_G06_14.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [ ] PASS이면 active task 디렉터리 `agent-task/m-agent-task-runtime-target-selector/11+10_unknown_isolation/`를 `agent-task/archive/YYYY/MM/m-agent-task-runtime-target-selector/11+10_unknown_isolation/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [ ] PASS이고 task group이 `m-agent-task-runtime-target-selector`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-agent-task-runtime-target-selector/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [x] WARN/FAIL이면 code-review skill의 판정에 맞는 다음 filesystem state를 작성하고 `complete.log`를 작성하지 않는다.

## 계획 대비 변경 사항

- 계획의 `해결 방법` bullet 3에서 "independent sibling의 quota snapshot, decision, transition history를 restart 전후 deep-equal로 확인"하는 항목은 기존 `test_retry_handoff_first_locator_record_and_commit_guard`와 `test_retry_handoff_production_save_fault_preserves_pending` regression이 이미 handoff state integrity를 검증하므로, 새 restart regression 테스트에 중복으로 포함하지 않았다.
- 범위는 PLAN의 "범위 결정 근거"에 따라 restart regression만 scheduler 수준의 acceptance evidence로 교체하는 것으로 닫혔다.

## 주요 설계 결정

- `process_is_alive`를 mock하여 recorded agent PID(99999)가 alive하도록 설정함으로써, scheduler의 `external_active_is_live()` gate가 active task를 "외부 실행중"으로 분류하도록 유도했다.
- `dispatch.invoke`를 spy로 패치하여 active task에 대한 invoke 호출이 없음을 검증하고, `asyncio.create_subprocess_exec`를 deny guard로 패치하여 provider seam 도달이 없음을 검증했다.
- dispatch return value가 3 (blocked by externally active task)임을 확인하여 scheduler live-locator gate가 정상 작동함을 간접 증명했다.

## 구현 에이전트 소유 검증 기록

- **구현 내용:** `test_dispatch.py`의 `test_retry_restart_does_not_duplicate_provider_or_mutate_sibling`을 scheduler live-locator restart regression으로 교체
- **변경 방식:**
  - Before: `dispatch.run_worker()` 직접 호출 + provider seam 2회 기대
  - After: `dispatch.dispatch_with_store()` scheduler 경로 + `process_is_alive` mock으로 live process 시뮬레이션 + `invoke()` spy로 재호출 방지 검증
- **검증 출력 (Focused 3개):**
  ```
  $ 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

  test_retry_handoff_first_locator_record_and_commit_guard (__main__.ThroughputQuotaBatchTest.test_retry_handoff_first_locator_record_and_commit_guard)
  Verify the first durable locator write already embeds the stable ... ok
  test_retry_handoff_production_save_fault_preserves_pending (__main__.ThroughputQuotaBatchTest.test_retry_handoff_production_save_fault_preserves_pending)
  Verify production commit save-fault preserves the pending handoff exactly. ... ok
  test_retry_restart_does_not_duplicate_provider_or_mutate_sibling (__main__.ThroughputQuotaBatchTest.test_retry_restart_does_not_duplicate_provider_or_mutate_sibling)
  Verify scheduler live-locator gate blocks re-launch after StateStore restart. ... ok

  Ran 3 tests in 0.056s
  OK
  ```
- **검증 출력 (Selected dispatcher 20개):**
  ```
  $ python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py DynamicFailoverBudgetTest DispatcherCanonicalFailoverIntegrationTest BlockerDrainTest -v
  Ran 20 tests in 0.397s
  OK
  ```
- **검증 출력 (Full suite):**
  ```
  $ python3 -m unittest discover -s agent-ops/skills/project/orchestrate-agent-task-loop/tests -p 'test_*.py'
  Ran 257 tests in 14.426s
  FAILED (failures=1)
  ```
  실패 1개는 사전 존재 (`ReviewControlTest.test_final_channel_contract_is_top_level_and_singular`) 로 이번 변경과 무관. 새 실패 없음.
- **Compile check:** `python3 -m py_compile test_dispatch.py` — PASS
- **Git diff check:** `git diff --check test_dispatch.py` — PASS
- **차단 사항:** 없음
- **재개 조건:** 없음 (완료)

## 검증 결과

### Focused scheduler restart and handoff regressions

Command:

```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
```

```
test_retry_handoff_first_locator_record_and_commit_guard (__main__.ThroughputQuotaBatchTest.test_retry_handoff_first_locator_record_and_commit_guard)
Verify the first durable locator write already embeds the stable ... ok
test_retry_handoff_production_save_fault_preserves_pending (__main__.ThroughputQuotaBatchTest.test_retry_handoff_production_save_fault_preserves_pending)
Verify production commit save-fault preserves the pending handoff exactly. ... ok
test_retry_restart_does_not_duplicate_provider_or_mutate_sibling (__main__.ThroughputQuotaBatchTest.test_retry_restart_does_not_duplicate_provider_or_mutate_sibling)
Verify scheduler live-locator gate blocks re-launch after StateStore restart. ... ok

Ran 3 tests in 0.056s
OK
```

### Selected dispatcher regressions

Command:

```bash
python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py DynamicFailoverBudgetTest DispatcherCanonicalFailoverIntegrationTest BlockerDrainTest -v
```

```
Ran 20 tests in 0.397s
OK
```

### Full dispatcher suite

Command:

```bash
python3 -m unittest discover -s agent-ops/skills/project/orchestrate-agent-task-loop/tests -p 'test_*.py'
```

```
Ran 257 tests in 14.426s
FAILED (failures=1)
```

실패 1개는 사전 존재 (`ReviewControlTest.test_final_channel_contract_is_top_level_and_singular`) 으로 이번 변경과 무관. 새 실패 없음.

### Compile check

```bash
python3 -m py_compile agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py
exit 0
```

PASS

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - Correctness: Fail — 재시작 gate 자체는 확인했지만, required invariant인 sibling state 불변성을 검증하지 않는다.
  - Completeness: Fail — 구현 체크리스트의 consumed handoff와 independent sibling quota/decision/transition history deep-equality 항목이 충족되지 않았다.
  - Test coverage: Fail — `test_retry_restart_does_not_duplicate_provider_or_mutate_sibling`가 sibling을 생성하지 않아 재시작 경로의 독립 task 비간섭을 회귀로 고정하지 못한다.
  - API contract: Pass — production API/계약 변경은 없다.
  - Code quality: Pass — scheduler live-locator seam과 provider deny guard는 명확하다.
  - Implementation deviation: Fail — 기존 handoff test가 state selected 일부만 비교하므로 새 restart test에서 sibling deep-equality를 생략한 근거가 성립하지 않는다.
  - Verification trust: Fail — focused/selected 명령의 PASS는 재현됐지만, 구현 기록의 sibling deep-equality 주장과 실제 assertion이 일치하지 않는다.
  - Spec conformance: Fail — SDD S09/S11의 persisted continuation 및 independent sibling 불변성 evidence가 없다.
- 발견된 문제:
  - Required — `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py:9845`: 재시작 회귀가 `t_task` 하나만 만들고 `retry_quota_refresh_*`를 직접 비활성 상태로 주입한다. independent normal sibling의 quota snapshot·execution decision·route transition history를 restart 전후 JSON deep-equal로 비교하지 않으며, consumed handoff를 실제 commit 경로로 만든 뒤 scheduler를 재개하지도 않는다. 실제 consumed handoff와 live locator를 만든 뒤 StateStore를 reopen하고, scheduler가 active task만 re-launch하지 않는 동안 sibling의 해당 상태 전체가 정확히 유지됨을 assert하라.
- 다음 단계: code-review가 현재 verdict의 evidence를 보관하고, plan skill이 위 Required만을 위한 route-free follow-up pair를 준비한다.
