<!-- task=m-agent-task-runtime-target-selector/07+06_context_review_recovery plan=1 tag=TEST -->

# Code Review Reference - TEST

> **[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.

## 개요

date=2026-07-26
task=m-agent-task-runtime-target-selector/07+06_context_review_recovery, plan=1, tag=TEST

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/agent-task-runtime-target-selector.md`
- Task ids: `context-failover`, `failure-budget`, `dispatch-integration`, `audit-tests`
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- `plan_local_G08_0.log`와 `code_review_cloud_G09_0.log`는 retry-blocked test의 actual provider 실행 결함 기록이다. 공식 verdict가 없고 PASS 출력은 새 완료 evidence가 아니다.

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

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

1. 실제 source와 검증 출력을 대조해 판정을 append한다.
2. `CODE_REVIEW-cloud-G07.md` → `code_review_cloud_G07_1.log`, `PLAN-local-G07.md` → `plan_local_G07_1.log`로 아카이브한다.
3. PASS이면 `complete.log`을 작성하고 active task directory를 archive한다. WARN/FAIL이면 code-review skill의 다음 상태만 작성한다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| TEST-1 Dispatcher simulation provider-deny guard | [x] |
| TEST-2 계획 단계 provider 격리 규칙 | [x] |

## 구현 체크리스트

- [x] provider-deny guard와 retry-blocked state-only fake를 추가해 provider command/session/process 0건을 검증한다.
- [x] `testing` domain rule과 project domain map에 dispatcher simulation planning gate를 기록한다.
- [x] focused/full unittest, py_compile, diff check의 실제 출력과 provider 0건 evidence를 review에 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

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

> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.

- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [ ] 판정과 Required/Suggested/Nit 분류가 일치한다.
- [ ] active `CODE_REVIEW-cloud-G07.md`를 `code_review_cloud_G07_1.log`로 아카이브한다.
- [ ] active `PLAN-local-G07.md`를 `plan_local_G07_1.log`로 아카이브한다.
- [ ] `.gitignore` Agent-Ops block을 확인한다.
- [ ] PASS이면 `complete.log`를 작성하고 active `.md`를 남기지 않는다.
- [ ] PASS이면 active task directory를 `agent-task/archive/YYYY/MM/m-agent-task-runtime-target-selector/07+06_context_review_recovery/`로 이동한다.
- [ ] PASS이면 runtime completion metadata만 보고하고 roadmap을 직접 수정하지 않는다.
- [ ] WARN/FAIL이면 `complete.log`를 작성하지 않는다.

## 계획 대비 변경 사항

- production `dispatch.py` route/selector policy는 plan 범위대로 수정하지 않았다.
- TEST-2의 provider 격리 규칙 본문과 project domain map은 현재 HEAD `5b56add0d898dc0080fdb3997f32881605b72ca3`에 이미 포함되어 있어, 구현 diff에서는 `testing` rule의 `last_rule_review_commit`만 현재 HEAD로 갱신했다.
- focused retry-blocked 회귀와 `py_compile`은 통과했지만 class/full suite는 기존 review decision schema drift로 차단되었다. `synthesized_official_review_decision()`이 반환하는 object에는 `agent_spec_from_decision()`이 `dispatch.py:1081`에서 요구하는 nested `decision`이 없고 `lane`/`grade`도 없다. plan이 production dispatcher 변경을 범위 제외했으므로 이 worker override에서 임의 수정하지 않았다.
- 재개 조건: official review decision의 synthesized schema를 canonical selector schema와 일치시키거나 fixed-review 전용 validation 경계를 명시적으로 추가한 후 class/full Python 명령을 다시 실행한다.

## 주요 설계 결정

- `SelectorDispatcherIntegrationTest.asyncSetUp()`에서 `dispatch.invoke`와 `dispatch.build_command`를 fail-fast mock으로 막고 `addCleanup()`으로 test별 patch lifecycle을 닫았다. selector decision 자체와 명시적으로 fake 처리한 `run_escalating` semantics는 그대로 검증한다.
- retry-blocked case는 `scan_tasks=[]`로 고정해 `store.clear_blocked()`의 blocker/budget 초기화만 수행하고, dispatcher return code `0`, `invoke` call count `0`, `build_command` call count `0`을 함께 assertion한다.
- 이 worker는 provider CLI를 호출하지 않았고 provider session/process를 생성하지 않았다. full suite 출력의 `pi-sessions`와 provider banner는 `/tmp` fake locator/session fixture이며 실제 provider 실행 evidence가 아니다.

## 리뷰어를 위한 체크포인트

- default guard가 `invoke`와 provider command construction을 fail-fast로 막는가.
- retry-blocked case가 empty scan/state-only fake 아래에서 blocker/budget만 검증하는가.
- focused/full suite evidence가 실제 provider process/session 0건을 보이는가.
- domain rule과 project path map이 다음 plan에서 dispatcher files에 적용되는가.

## 검증 결과

### focused retry-blocked isolation

명령: `python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py SelectorDispatcherIntegrationTest.test_context_budget_and_retry_blocked_lifecycle -v`

```text
test_context_budget_and_retry_blocked_lifecycle (__main__.SelectorDispatcherIntegrationTest.test_context_budget_and_retry_blocked_lifecycle) ... ------------------------------------------
작업완료: agent-task
------------------------------------------
active task 없음
verified_complete_tasks=0
ok

----------------------------------------------------------------------
Ran 1 test in 0.049s

OK
```

provider evidence: `self.invoke_deny_guard.assert_not_called()` PASS, `self.build_cmd_deny_guard.assert_not_called()` PASS, real provider command/session/process=`0/0/0`.

### Selector dispatcher simulations

명령: `python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py SelectorDispatcherIntegrationTest -v`

```text
ERROR: test_review_recovery_and_runtime_audit_evidence (__main__.SelectorDispatcherIntegrationTest.test_review_recovery_and_runtime_audit_evidence)
agent_task_dispatch.ExecutionDecisionError: selector policy validation 실패: 'decision'

FAIL: test_worker_and_review_initial_invocation_uses_selector (__main__.SelectorDispatcherIntegrationTest.test_worker_and_review_initial_invocation_uses_selector)
AssertionError: 1 != 2

Ran 7 tests in 0.171s
FAILED (failures=1, errors=1)
```

provider evidence: class default deny guard remained active; real provider command/session/process=`0/0/0`.

### full Python suite

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

```text
ERROR: test_reopen_body_edit_and_generation_reset_preserve_or_reset_pin (test_dispatch.RouteDecisionPersistenceTest.test_reopen_body_edit_and_generation_reset_preserve_or_reset_pin)
ERROR: test_review_recovery_and_runtime_audit_evidence (test_dispatch.SelectorDispatcherIntegrationTest.test_review_recovery_and_runtime_audit_evidence)
FAIL: test_exhausted_review_budget_does_not_invoke_model (test_dispatch.RepetitionLimitTest.test_exhausted_review_budget_does_not_invoke_model)
FAIL: test_review_tenth_no_progress_pass_blocks_task (test_dispatch.RepetitionLimitTest.test_review_tenth_no_progress_pass_blocks_task)
FAIL: test_worker_and_review_initial_invocation_uses_selector (test_dispatch.SelectorDispatcherIntegrationTest.test_worker_and_review_initial_invocation_uses_selector)

Ran 214 tests in 9.834s

FAILED (failures=3, errors=2)
```

전체 stdout/stderr 저장 경로: `/tmp/iop-g07-full-unittest.log`.

다섯 실패는 모두 `synthesized_official_review_decision()`의 schema 누락으로 review stage가 model invocation 전 차단된 결과다. 실제 provider CLI는 호출하지 않았으며 real provider command/session/process=`0/0/0`이다.

### py_compile

명령: `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`

```text
(stdout/stderr 없음, exit 0)
```

### diff check

명령: `git diff --check`

```text
(stdout/stderr 없음, exit 0)
```

---

> **[IMPLEMENTING AGENT — BEFORE SAVING]** Fill every implementation-owned section, then leave review-only sections unchanged.

## 섹션 소유권

| Section | Owner | Note |
|---------|-------|------|
| Header, 개요, Roadmap Targets, Archive Evidence Snapshot | Fixed at stub creation | Implementing agent must not modify. |
| 구현 항목별 완료 여부, 구현 체크리스트 | Implementing agent | Check only after actual implementation/evidence. |
| 코드리뷰 전용 체크리스트 | Review agent only | Implementing agent must not modify. |
| 계획 대비 변경 사항, 주요 설계 결정, 검증 결과 | Implementing agent | Record actual output only. |
| 코드리뷰 결과 | Review agent appends | Not present in stub. |

## 코드리뷰 결과

- 리뷰 실행: 사용자 지정 cloud-G09 공식 리뷰 override. 활성 artifact의 `cloud-G07` basename은 변경하지 않았다.
- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Fail — focused provider-isolation 동작은 맞지만 synthesized official-review decision을 소비하는 실제 dispatcher 경로가 schema validation에서 중단된다.
  - completeness: Fail — plan이 필수로 요구한 selector class PASS와 full unittest PASS가 충족되지 않았다.
  - test coverage: Pass — provider-deny guard, state-only empty scan, command/invocation non-call assertion이 실제 회귀를 검증하며 실패한 통합 경로도 결정적으로 노출한다.
  - API contract: Fail — synthesized official-review decision이 canonical selector decision schema를 만족하지 않는다.
  - code quality: Pass — 변경은 test guard와 project-local testing rule metadata에 한정되고 debug/dead-code/TODO를 추가하지 않는다.
  - implementation deviation: Pass — production `dispatch.py`를 수정하지 않은 것은 plan의 명시적 범위 제외와 일치하며, 실패는 범위 밖 기존 구현에서 발생한다.
  - verification trust: Pass — 격리된 fresh 재실행 결과가 구현 evidence의 focused/class/full/compile/diff 결과와 일치한다.
  - spec conformance: Fail — SDD S09/S12가 요구하는 review invocation 및 회귀 suite 완료 evidence를 충족하지 못한다.
- 발견된 문제:
  - Required — `agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py:1189`: `synthesized_official_review_decision()`이 flat `rule_id`/`priority`와 `quota_snapshot`만 반환하고 top-level `lane`/`grade` 및 `agent_spec_from_decision()`이 `dispatch.py:1081`에서 요구하는 nested `decision`을 만들지 않는다. 그 결과 `test_reopen_body_edit_and_generation_reset_preserve_or_reset_pin`, `test_review_recovery_and_runtime_audit_evidence`가 error가 되고, `test_exhausted_review_budget_does_not_invoke_model`, `test_review_tenth_no_progress_pass_blocks_task`, `test_worker_and_review_initial_invocation_uses_selector`가 동일 선행 차단의 downstream failure가 되어 필수 class/full 검증이 실패한다. synthesized decision을 canonical review selector schema와 동일하게 만들거나 fixed-review 전용 validation 경계를 명시적으로 구현한 뒤 다섯 테스트와 전체 suite를 모두 PASS시켜야 한다.
- 다음 단계: FAIL — 위 `dispatch.py` schema 결함을 별도 보완 범위에서 수정하고 provider-deny 환경으로 focused test, selector class, full unittest, `py_compile`, `git diff --check`를 모두 재실행한다. 이 사용자 지정 리뷰에서는 active pair를 유지하며 archive와 `complete.log`를 작성하지 않는다.
- 리뷰 검증 evidence:
  - `env PATH=/usr/bin:/bin python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py SelectorDispatcherIntegrationTest.test_context_budget_and_retry_blocked_lifecycle -v` — 1 test PASS.
  - `env PATH=/usr/bin:/bin python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py SelectorDispatcherIntegrationTest -v` — 7 tests, 1 failure/1 error.
  - `env PATH=/usr/bin:/bin python3 -m unittest discover -s agent-ops/skills/project/orchestrate-agent-task-loop/tests -p 'test_*.py'` — 214 tests, 3 failures/2 errors.
  - `env PATH=/usr/bin:/bin 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` — exit 0.
  - `git diff --check` — exit 0, 출력 없음.
  - real provider command/session/process 신규 실행 수: `0/0/0`. 실제 provider binary 디렉터리를 제외한 `PATH=/usr/bin:/bin`에서 Python 검증만 실행했다.
