<!-- task=m-agent-task-runtime-target-selector/08+07_selfcheck_policy plan=5 tag=REVIEW_TEST -->

# Plan - valid cloud completion 회귀 행렬 완성

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

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

## 배경

strict completing-decision validator의 invalid schema/class 회귀는 고정됐지만, 계획이 요구한 valid cloud 경로는 `claude` 단일 수동 state 주입만 검증한다. 세 cloud adapter 모두가 validation, completion commit, restart에서 정상적으로 review로 진행하는지 같은 canonical case table로 고정해 SDD S10 evidence를 완성한다.

## 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:
  - `selfcheck-policy`: 실제 worker 완료 target의 local/cloud 성격으로 selfcheck 결정
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- Task: `agent-task/m-agent-task-runtime-target-selector/08+07_selfcheck_policy/`
- Prior loop artifacts: `agent-task/m-agent-task-runtime-target-selector/08+07_selfcheck_policy/plan_local_G03_4.log`, `agent-task/m-agent-task-runtime-target-selector/08+07_selfcheck_policy/code_review_cloud_G03_4.log`
- Verdict: `FAIL`
- Issue summary: Required 1, Suggested 0, Nit 0 — 세 cloud adapter 표가 invalid 거부에만 쓰이고 valid cloud validation/`_mark_worker_done()` commit/restart review 행렬이 누락됐다.
- Affected files: `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py`
- Verification evidence: focused 22건, pinned-target integration 1건, 전체 236건, `py_compile`, `git diff --check`는 모두 PASS했지만 필수 valid variant가 suite에 없었다.
- Roadmap carryover: Milestone Task `selfcheck-policy`, SDD Acceptance Scenario S10과 Evidence Map S10을 계속 대상으로 한다.
- Narrow reread allowed: 정확한 직전 판정 문맥이 필요할 때 위 `plan_local_G03_4.log`와 `code_review_cloud_G03_4.log`만 읽는다.

## 분석 결과

### 읽은 파일

- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/common/rules-roadmap.md`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-test/local/rules.md`
- `agent-test/local/testing-smoke.md`
- `agent-roadmap/current.md`
- `agent-roadmap/phase/automation-runtime-bridge/PHASE.md`
- `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/common/rules-agent-spec.md`
- `agent-spec/index.md`
- `agent-contract/index.md`
- `agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md`
- `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/08+07_selfcheck_policy/plan_local_G03_4.log`
- `agent-task/m-agent-task-runtime-target-selector/08+07_selfcheck_policy/code_review_cloud_G03_4.log`

### SDD 기준

- SDD는 `agent-roadmap/sdd/automation-runtime-bridge/agent-task-runtime-target-selector/SDD.md`, 상태 `[승인됨]`, 잠금 `해제`다.
- 대상은 Acceptance Scenario S10과 Evidence Map S10이며 Milestone Task id는 `selfcheck-policy`다.
- cloud completion은 selfcheck 없이 완료되고 local completion만 pinned target으로 selfcheck한다는 기준을 세 cloud adapter의 valid validation/commit/restart evidence와 기존 invalid fail-closed evidence로 검증한다.

### 테스트 환경 규칙

- `test_env=local`; `agent-test/local/rules.md`와 `agent-test/local/testing-smoke.md`를 읽었다.
- dispatcher unit/integration simulation은 실제 provider process를 실행하지 않으므로 `CompletingTargetSelfcheckTest`의 `invoke`/`build_command` provider-deny guard를 유지한다.
- fresh Python `unittest`, `py_compile`, `git diff --check`를 사용한다. production 실행 경로를 바꾸지 않는 test-only 보완이므로 Edge-Node full-cycle, mock smoke, live provider preflight는 적용하지 않는다.

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

- `test_completing_decision_validation_matrix`의 valid cloud는 `claude` 하나뿐이며 `agy`/`codex`를 검증하지 않는다.
- `test_cloud_completing_decision_skips_selfcheck`는 `store.update_task()`로 `claude` state를 직접 주입해 `_mark_worker_done()`의 정상 commit을 우회한다.
- 세 adapter 공통 표는 invalid `_mark_worker_done()` no-commit과 restart blocked에만 쓰이며 valid commit 후 `worker_done=True`, `selfcheck_done=True`, `task_stage() == "review"` 행렬이 없다.

### 심볼 참조

- production rename/remove는 없다. 테스트 메서드를 matrix 이름으로 바꾸면 외부 call site는 없고 unittest discovery만 소비한다.

### 분할 판단

- split 정책을 먼저 평가했다. 단일 test class 안에서 같은 cloud case/decision factory를 validation, commit, restart assertion에 재사용하는 test-only 원자 변경이다.
- API/foundation, 다중 domain, 별도 검증 profile, 독립 산출물이 없고 분할하면 같은 table을 중복하므로 기존 `08+07_selfcheck_policy` 단일 subtask를 유지한다.
- predecessor `07+06_context_review_recovery`는 이미 완료된 선행 작업이며 현재 follow-up은 기존 task-local loop를 계속한다.

### 범위 결정 근거

- `dispatch.py`의 strict validator와 completion/stage 로직은 현재 올바르므로 변경하지 않는다.
- selector route, quota/failover, failure budget, runtime skill, 중앙 관리 `agent-ops/rules/common/**`와 `agent-ops/skills/common/**`, roadmap/SDD/contract/spec 문서는 변경하지 않는다.
- `WORK_LOG.md`, sibling task, repo의 다른 dirty/untracked 파일과 실제 provider 실행은 범위에서 제외한다.
- agent-spec index와 agent-contract index에는 dispatcher 내부 completing-decision 상태에 직접 매칭되는 문서가 없어 문서 갱신 대상이 아니다.

### 최종 라우팅

- evaluation mode=`isolated-reassessment`; finalizer=`finalize-task-policy.sh`; finalizer mode=`pair`; missing evidence=`[]`; blocked reason=`null`.
- build closures=`scope/context/verification/evidence/ownership/decision 모두 true`; 단일 test class, 정확한 누락 variant, deterministic focused/full suite, test-only ownership과 사용자 결정 부재로 닫혔다. route basis=`local-fit`; capability gap=`none`; scores=`scope_coupling 1, state_concurrency 0, blast_irreversibility 0, evidence_diagnosis 1, verification_complexity 1`; final=`local-G03`; filename=`PLAN-local-G03.md`.
- build loop-risk snapshot: `ordered_transitions={state_count: 3, adverse_paths: [validation reject, completion no-commit, restart blocked], evidence: validator/commit/task_stage tests}`; `concurrent_consistency={actor_count: 1, constraints: [], evidence: isolated StateStore subtests}`; `boundary_contract={component_count: 3, consumer_count: 3, constraints: [selected exact type, adapter/class/selfcheck immutability], evidence: validator/commit/restart consumers}`; `structured_interpretation={mechanisms: [nested persisted selected schema], hazards: [wrong input shape, duplicated case tables], evidence: direct validator and completion tests}`; `variant_product={independent_axis_count: 3, combination_verification_required: true, evidence: adapter × validity × consumption path}`. matched signatures=`temporal_state, boundary_contract, structured_interpretation, variant_product`; triggered=`true`.
- review closures=`scope/context/verification/evidence/ownership/decision 모두 true`; route basis=`official-review`; capability gap=`none`; scores=`1/0/0/1/1`; final=`cloud-G03`; filename=`CODE_REVIEW-cloud-G03.md`; execution=`codex/gpt-5.6-sol xhigh`.
- repetition/signature 기반 lane/G floor=`none`; universal cloud floor=`none`; capability-gap floor=`none`.

## 구현 체크리스트

- [ ] `CompletingTargetSelfcheckTest`에 canonical `agy|claude|codex` case table과 completing-decision factory를 한 번만 정의하고 valid `cloud_model + False`, invalid `local_model + False`, adapter/target/execution_class non-string을 validation matrix에서 모두 검증한다.
- [ ] 같은 case table로 `_mark_worker_done()`의 valid cloud commit과 invalid no-commit, restart `task_stage()`의 valid `review`와 invalid `blocked`를 세 adapter 모두에 검증하고 provider-deny guard를 유지한다.
- [ ] focused class, pinned-target integration, 전체 Python suite, `py_compile`, `git diff --check`를 fresh process에서 통과시킨다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 구현 항목

### [REVIEW_TEST-1] Valid/invalid cloud completion matrix 통합

- 문제: `test_dispatch.py:615-648`은 `claude` valid state를 직접 주입하고, `test_dispatch.py:1006-1015`도 `claude`만 valid로 검증한다. `test_dispatch.py:1096-1117`, `1345-1392`, `1445-1489`의 세 adapter table은 invalid 경로만 검증해 활성 계획의 valid validation/commit/restart 기준을 충족하지 못한다.
- 해결 방법: class-level immutable cloud case tuple과 decision factory를 추가한다. `test_completing_decision_validation_matrix`는 같은 표의 valid/invalid decision을 각각 accept/reject하고 non-string field table을 유지한다. completion matrix는 valid decision을 `execution_decisions["worker"]`에 저장한 뒤 `_mark_worker_done()`을 호출해 completion fields와 `review` stage를 확인하고, 별도 store의 invalid decision은 예외와 no-commit을 확인한다. restart matrix는 valid persisted state가 `review`, invalid state가 `blocked`인지 같은 표로 확인한다.

Before (`test_dispatch.py:1006-1015`, `1345-1392`):

```python
valid_cloud = {
    "selected": {"adapter": "claude", "target": "claude-opus-4-8",
                 "execution_class": "cloud_model", "selfcheck_required": False},
}
cloud_cases = [("agy", "..."), ("claude", "..."), ("codex", "...")]
# cloud_cases is used only for invalid decisions.
```

After:

```python
_CLOUD_CASES = (("agy", "..."), ("claude", "..."), ("codex", "..."))

@classmethod
def make_cloud_decision(cls, adapter, target, execution_class="cloud_model"):
    return {"work_unit_id": cls._WORK_UNIT_ID, "stage": "worker",
            "selected": {"adapter": adapter, "target": target,
                         "execution_class": execution_class,
                         "selfcheck_required": False}}

for adapter, target in self._CLOUD_CASES:
    valid = self.make_cloud_decision(adapter, target)
    invalid = self.make_cloud_decision(adapter, target, "local_model")
    # assert valid validation/commit/review and invalid reject/no-commit/blocked.
```

- 수정 파일 및 체크리스트:
  - [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py`: cloud case/factory를 단일화하고 validation, completion commit, restart의 valid/invalid subtest matrix를 완성한다.
- 테스트 작성: 작성한다. `test_completing_decision_validation_matrix`, cloud `_mark_worker_done()` matrix, cloud restart matrix에서 세 adapter의 성공/실패 state를 assertion하고 기존 provider-deny fixture를 사용한다.
- 중간 검증: `python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py CompletingTargetSelfcheckTest -v` — 22개 test method와 모든 cloud subtest PASS.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py` | REVIEW_TEST-1 |

## 최종 검증

1. `python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py CompletingTargetSelfcheckTest -v` — valid/invalid cloud validation/commit/restart matrix 전체 PASS.
2. `python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py SelectorDispatcherIntegrationTest.test_completing_target_controls_selfcheck_and_reuses_pin -v` — local/cloud completing-target integration PASS.
3. `python3 -m unittest discover -s agent-ops/skills/project/orchestrate-agent-task-loop/tests -p 'test_*.py'` — 전체 dispatcher suite PASS; cached output을 사용하지 않고 fresh Python process 결과를 기록한다.
4. `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` — syntax PASS.
5. `git diff --check` — whitespace error 없음.

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