<!-- task=m-agent-task-runtime-target-selector/12+08,11_audit_closure plan=0 tag=TEST -->

# Plan - 동적 selector 정책 audit와 운영 설명 동기화

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

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

## 배경

기능 구현이 끝나도 skill의 정적 route/동시성 설명과 분산된 테스트가 새 selector 정책을 완전하게 증명하지 못하면 운영 drift가 남는다. 이 작업은 새 기능을 추가하지 않고 정책 matrix, 추적 evidence, 단위·통합 회귀, 운영 설명을 하나의 최종 audit로 닫는다.

## 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:
  - `audit-tests`: 선택·고정·failover·quota·예산·blocker 추적과 테스트·운영 설명 일치
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `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/skills/common/philosophy.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/scripts/execution_target_policy.py`
- `agent-ops/skills/project/orchestrate-agent-task-loop/scripts/select_execution_target.py`
- `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py`
- `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_execution_target_policy.py`
- `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_select_execution_target.py`
- `agent-test/local/rules.md`
- `agent-ops/rules/common/rules-agent-spec.md`
- `agent-spec/index.md`
- `agent-contract/index.md`

### SDD 기준

- SDD: `agent-roadmap/sdd/automation-runtime-bridge/agent-task-runtime-target-selector/SDD.md`, 상태 `[승인됨]`, 잠금 해제.
- 대상 Acceptance Scenario: S12 → `audit-tests`.
- Evidence Map S12 행의 회귀 테스트, reason/transition 로그와 운영 문서 diff를 따라 success, failover, quota block, budget block, review block의 work unit/rule/candidate/reason/transition evidence를 구현 체크리스트와 최종 검증에 반영했다.

### 테스트 환경 규칙

- `test_env=local`; `agent-test/local/rules.md`가 존재하며 끝까지 읽었다.
- agent-ops Python dispatcher에 매칭되는 `agent-test/local/*.md` profile은 없다. 현재 checkout의 Python test manifest를 fallback 근거로 삼아 fresh-process `unittest`, `py_compile`, `git diff --check`를 사용하며 test-rule 유지보수는 필요하지 않다.
- fake clock/quota/runner와 임시 workspace를 사용해 provider 호출 없이 재현한다.
- 계획 시점 전체 Python suite 기준선은 169 tests PASS다.

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

- 단위 테스트들이 개별 selector/dispatcher 속성은 검증하지만 하나의 work unit이 initial→resume/failover→success/selfcheck 또는 blocker로 이어지는 audit chain을 고정하지 않는다.
- 운영 skill의 route 표와 처리량/자가검증 설명에는 정적 정책과 구 모델명이 남아 있어 새 runtime 기준과 drift한다.
- work unit, rule/priority, candidate rank/selected target, reason, quota, transition이 locator, persisted history, status/dry-run에 일관되게 나타나는지 한 번에 검증하지 않는다.

### 심볼 참조

- project `SKILL.md`의 route 표, 실행 절차, 승격/context 복구, selfcheck, 동시 실행 제한, 검증 체크리스트를 전수 대조한다.
- 제거가 예정된 `route_agent`, `invocation_semaphore`, target semaphore map, 구 모델명과 운영 문구를 `rg --sort path` 기반 zero-match assertion으로 감사한다.

### 분할 판단

- split 정책을 평가했으며 이 task는 selector 통합, selfcheck, throughput의 최종 cross-policy evidence와 운영 문서를 함께 닫으므로 원본 pair를 유지한다.
- 전체 topology는 `03 → 04 → 05 → 06 → 07 → 08 → 09 → 10 → 11 → 12`다.
- 현재 predecessor `08+07_selfcheck_policy`와 `11+10_unknown_isolation`은 active plan만 있고 `complete.log`가 없어 미충족이다.
- audit를 더 나누면 동일 state/locator/status evidence와 drift 검증을 중복하게 된다.

### 범위 결정 근거

- 새 selector 정책, provider adapter, quota producer, roadmap 완료 리뷰는 추가/변경하지 않는다.
- audit에서 기능 결함이 발견되면 숨겨서 우회하지 않고 이 plan 범위의 직접 결함만 수정하거나 review evidence에 후속 필요를 기록한다.
- 중앙 관리 common skill/rule은 수정하지 않고 project skill만 동기화한다.
- `agent-spec/index.md`와 `agent-contract/index.md`에 매칭되는 활성 selector/dispatcher spec/contract가 없으므로 승인 SDD, 코드와 테스트를 기준으로 삼는다.

### 최종 라우팅

- evaluation_mode: `isolated-reassessment`
- finalizer=`finalize-task-policy.sh`, finalizer_mode=`pair`; build/review status=`routed`.
- build closures: `scope_closed=true`(승인 SDD와 이 subtask 경계가 고정됨), `context_closed=true`(명시된 source/test 범위를 한 local 작업에서 유지 가능), `verification_closed=true`, `evidence_trusted=true`, `ownership_closed=true`, `decision_closed=true`.
- review closures: `scope_closed=true`, `context_closed=true`(동일 source/test 및 구현 evidence로 판정 가능), `verification_closed=true`, `evidence_trusted=true`, `ownership_closed=true`, `decision_closed=true`.
- build route_basis=`local-fit`; capability_gap=`none`.
- build loop-risk audit: matched signatures=`없음`; 이 기록은 lane/G를 바꾸지 않는다.
- build scores(scope_coupling/state_concurrency/blast_irreversibility/evidence_diagnosis/verification_complexity)=`2/1/0/2/2`, final=`local-G07`, filename=`PLAN-local-G07.md`.
- review route_basis=`official-review`; official execution=`codex/gpt-5.6-sol xhigh`; capability_gap=`none`.
- review scores(scope_coupling/state_concurrency/blast_irreversibility/evidence_diagnosis/verification_complexity)=`2/1/0/2/2`, final=`cloud-G07`, filename=`CODE_REVIEW-cloud-G07.md`.

## 구현 체크리스트

- [ ] 통합 audit가 work unit, rule/priority, candidate rank/selected target, reason, quota, transition으로 initial, pin/resume, failover, budget과 quota/review blocker를 추적한다.
- [ ] 운영 skill이 selector 호출 시점, target matrix, route pin, failover, selfcheck, batch quota와 무제한 target admission을 실제 구현과 일치하게 설명한다.
- [ ] deterministic drift search와 전체 suite가 구 정적 route/cap 설명 및 정책 회귀가 없음을 증명한다.
- [ ] SDD Evidence Map의 대표 scenario와 Roadmap Target 검증 근거가 review 문서에 추적 가능하게 기록된다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 구현 항목

### [TEST-1] Cross-scenario audit evidence

- 문제: `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py:1-5088`의 selector 관련 회귀는 여러 클래스에 분산돼 S12가 요구하는 success/failover/quota block/budget block/review block의 state/locator/status 연결을 한 번에 보장하지 않는다.
- 해결 방법: `DynamicSelectorAuditTest`에서 고정 시각과 quota snapshot으로 대표 work unit을 실행하고 `work_unit_id`, `rule_id`, `policy_priority`, candidate rank/selected target, reason codes, quota snapshot/status, transition과 budget을 persisted state, invocation, locator, status/dry-run에서 대조한다.
- 수정 파일 및 체크리스트:
  - [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py`: `DynamicSelectorAuditTest`.
  - [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_select_execution_target.py`: 필요한 reason/transition matrix 보강.
- 테스트 작성: `test_dispatch.py`의 `DynamicSelectorAuditTest`에 success/pinned resume, 양방향 initial의 qualified provider target 불가 failover와 generic same-target recovery, unknown 1회→confirmed exhausted quota blocker, 10회 budget blocker, user-review blocked branch와 독립 drain, completing-target selfcheck, batch snapshot case를 표 fixture로 연결한다.
- 중간 검증: `python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py DynamicSelectorAuditTest -v` — S12 다섯 outcome과 evidence-field assertions가 PASS해야 한다.

### [TEST-2] 운영 skill 정책 동기화

- 문제: `agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md:36-52,159-190`의 정적 route matrix, 승격/자가검증/동시성 설명이 runtime selector의 시간·quota·persisted transition 정책과 다르다.
- 해결 방법:

```text
# Before: agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md:36
PLAN lane/G → 고정 model 및 target별 동시 실행 제한

# After
PLAN lane/G → runtime selector input → persisted adapter/target,
       admission batch snapshot 재사용, target별 정책 cap 없음
```

  worker와 공식 review를 분리하고 KST 경계, cloud grade matrix, route pin, failover logical context, stage budget 10회, 실제 완료 target selfcheck를 정확히 기술한다.
- 수정 파일 및 체크리스트:
  - [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md`: route/실행/복구/검증 설명.
- 테스트 작성: 없음. 문서 변경이므로 TEST-3의 deterministic search와 구현 suite로 검증한다.
- 중간 검증: `bash -c 'matches=$(rg --sort path -n '"'"'Gemini 3\\.5|동시 실행 제한|route_agent\\(|invocation_semaphore|^[[:space:]]*semaphores = \\{'"'"' agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py); rc=$?; test "$rc" -eq 1 && test -z "$matches"'` — 금지 match 0건으로 exit 0이어야 한다.

### [TEST-3] Drift guard와 전체 회귀

- 문제: `agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md:36-52`와 `dispatch.py:977,2696,3755-3761`의 구 target/static route/cap이 재도입돼도 현재 suite가 정책 drift로 명시적으로 실패하지 않을 수 있다.
- 해결 방법: source-level assertion은 완전 제거하기로 한 production symbol과 운영 문구에만 제한하고 behavior test를 우선한다. `route_agent` compatibility helper도 `05`에서 제거되므로 허용 production match는 두지 않는다.
- 수정 파일 및 체크리스트:
  - [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py`: behavior 중심 drift guard.
  - [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_execution_target_policy.py`: canonical matrix 누락 시 보강.
  - [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_select_execution_target.py`: JSON evidence 필드 누락 시 보강.
- 테스트 작성: `test_execution_target_policy.py`, `test_select_execution_target.py`, `test_dispatch.py`에서 G01~G10 worker/review matrix와 SDD S05~S12 대표 흐름을 전체 suite로 실행한다.
- 중간 검증: `python3 -m unittest discover -s agent-ops/skills/project/orchestrate-agent-task-loop/tests -p 'test_*.py'` — fresh process 전체 suite가 PASS해야 한다.

## 의존 관계 및 구현 순서

1. `08+07_selfcheck_policy`와 `11+10_unknown_isolation`의 archived `complete.log`가 모두 PASS여야 한다.
2. TEST-1로 실제 evidence shape를 고정하고 TEST-2 문서를 그 결과에 맞춘 뒤 TEST-3으로 drift를 닫는다.
3. 이 task PASS 후 `sync-milestone-workstate`가 `audit-tests`를 반영하면 마일스톤 완료 검토가 가능하다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md` | TEST-2 |
| `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py` | TEST-1, TEST-3 |
| `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_execution_target_policy.py` | TEST-3 |
| `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_select_execution_target.py` | TEST-1, TEST-3 |

## 최종 검증

- `python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py DynamicSelectorAuditTest -v` — S12 audit matrix PASS.
- `python3 -m unittest discover -s agent-ops/skills/project/orchestrate-agent-task-loop/tests -p 'test_*.py'` — fresh process 전체 suite PASS; cache output은 허용하지 않는다.
- `python3 -m py_compile agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py agent-ops/skills/project/orchestrate-agent-task-loop/scripts/execution_target_policy.py agent-ops/skills/project/orchestrate-agent-task-loop/scripts/select_execution_target.py agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_execution_target_policy.py agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_select_execution_target.py` — exit 0.
- `bash -c 'matches=$(rg --sort path -n '"'"'Gemini 3\\.5|동시 실행 제한|route_agent\\(|invocation_semaphore|^[[:space:]]*semaphores = \\{'"'"' agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py); rc=$?; test "$rc" -eq 1 && test -z "$matches"'` — 금지 production match 0건, exit 0.
- `git diff --check` — 출력 없음.

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