<!-- task=agent_task_english_contract plan=0 tag=REFACTOR -->

# Agent-Task English Artifact Contract Migration

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

`CODE_REVIEW-cloud-G06.md`의 구현 에이전트 소유 섹션을 채우는 것이 구현의 필수 마지막 단계다. 계획의 검증 명령을 실행하고 실제 구현 내용과 stdout/stderr를 기록한 뒤 active 파일을 그대로 두고 리뷰 준비 완료를 보고한다. 차단되면 구현 소유 evidence 필드에 정확한 원인, 시도한 명령과 출력, 재개 조건만 기록한다. 사용자에게 질문하거나 user-input 도구·control-plane stop 파일을 사용하지 말고, 다음 상태를 분류하거나 로그 아카이브·`complete.log` 작성을 하지 않는다. 최종 판정과 아카이브는 code-review skill 소유다.

## 배경

PLAN/CODE_REVIEW는 로컬 모델을 포함한 구현·자가검증·리뷰 에이전트가 직접 읽고 수정하는 실행 계약이지만, 현재 정규 템플릿과 런타임 파서가 한국어 섹션명을 프로토콜로 사용한다. 작은 로컬 모델의 지시 해석 일관성을 높이기 위해 새 model-facing task artifact는 영어로 생성하되, 이미 열려 있거나 아카이브된 한국어 artifact는 계속 처리할 수 있어야 한다. 사용자-facing 최종 응답은 기존처럼 한국어로 유지한다.

## Archive Evidence Snapshot

- Prior completed task: `agent-task/archive/2026/07/dispatcher_observation_refactor/`
- Verdict: `PASS`
- Carried baseline: dispatcher observation 분리 이후의 현재 `dispatch.py`, orchestrator skill, dispatcher tests를 기준선으로 사용한다.
- Verification evidence: prior completion은 dispatcher test suite 262개 PASS를 기록했고, 현재 checkout에서도 같은 262개 suite가 PASS했다.
- Implementation rule: 이 snapshot만 선행 작업 근거로 사용하고 `agent-task/archive/**`를 다시 탐색하지 않는다.

## 분석 결과

### 읽은 파일

- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/common/rules-roadmap.md`
- `agent-ops/rules/common/philosophy.md`
- `agent-ops/skills/common/router.md`
- `agent-ops/skills/common/plan/SKILL.md`
- `agent-ops/skills/common/code-review/SKILL.md`
- `agent-ops/skills/common/finalize-task-routing/SKILL.md`
- `agent-ops/skills/common/plan/templates/review-stub-template.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-roadmap/current.md`
- `agent-roadmap/priority-queue.md`
- `agent-roadmap/ROADMAP.md`
- `agent-roadmap/phase/automation-runtime-bridge/PHASE.md`
- `agent-test/local/rules.md`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-test/local/testing-smoke.md`
- `.gitignore`
- `agent-task/archive/2026/07/dispatcher_observation_refactor/complete.log`

### SDD 기준

not applicable. 이 작업은 특정 Milestone 기능 Task를 완료하지 않는 Agent-Ops 내부 artifact 계약 유지보수다.

### 테스트 환경 규칙

- `test_env=local`
- `agent-test/local/rules.md`: 존재하며 정독했다.
- Matched profile: `agent-test/local/testing-smoke.md`를 읽었다. Edge/Node smoke·full-cycle 절차는 Python 기반 Agent-Ops Markdown parser 변경에는 적용하지 않는다.
- Applied verification: 실제 provider를 호출하지 않는 Python `py_compile`, focused `unittest`, dispatcher 전체 `unittest discover`, `git diff --check`.
- `<확인 필요>` 또는 외부 checkout 전제는 없다. 비로컬 preflight는 불필요하다.
- Fallback source: dispatcher의 기존 Python unittest layout과 provider invocation deny guards를 사용한다. 테스트 규칙 유지보수는 이번 범위에 필요하지 않다.
- Baseline: `python3 -m py_compile .../dispatch.py`와 전체 262 tests가 현재 checkout에서 PASS했다.

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

- 기존 tests는 한국어 `수정 파일 요약`, `구현 체크리스트`, `코드리뷰 결과`, `종합 판정` 경로를 다수 검증한다.
- 영어 canonical 섹션의 write-set, self-check, verdict, recovery 경로는 검증하지 않는다.
- 영어·한국어 semantic section이 동시에 있을 때 fail-closed 하는 중복 경계가 없다.
- artifact 작성 언어와 `Final in Korean.` 응답 언어를 분리하는 prompt 계약 검증이 없다.
- 실제 30B 이하 모델의 성공률 A/B는 비결정적·provider 의존 관찰이므로 구현 PASS 기준에서 제외한다. 영어 계약 배포 후 대표 task 표본으로 별도 관찰한다.

### 심볼 참조

renamed/removed symbol은 없다. `VERDICT_HEADING_RE`, `VERDICT_LINE_RE`, `VERDICT_BLOCK_RE`, `extract_write_set`, `markdown_section`, `implementation_review_errors`, `verdict_from_text`, `base_prompt` 이름을 유지하고 내부 alias 계약만 확장한다.

### 분할 판단

한 plan으로 유지한다. 새 pair의 영어 생성, 현재 한국어 pair의 schema-preserving 종료, dispatcher의 영어/한국어 dual-read가 한 migration invariant다. writer와 reader를 분리 배포하면 실행 중인 이전 dispatcher가 새 artifact를 해석하지 못할 수 있으므로 독립 PASS 가능한 child로 분할하지 않는다.

### 범위 결정 근거

- 새 active PLAN/CODE_REVIEW와 그 review verdict만 model-facing 영어 canonical 대상으로 한다.
- `USER_REVIEW.md`, `complete.log`, `WORK_LOG.md`, roadmap 문서, dispatcher banner, 사용자-facing 최종 응답은 사람·control-plane 영역이므로 번역하지 않는다.
- 기존 archive 내용은 수정하지 않는다. parser와 review workflow만 legacy 한국어 artifact를 읽고 현재 legacy pair를 같은 schema로 종료한다.
- 파일명, header identity, `PASS|WARN|FAIL`, lane/G, path, status/id/runtime token은 ASCII 프로토콜 그대로 유지한다.
- 현재 사용자가 조정한 `agent-ops/skills/common/plan/SKILL.md`와 `agent-ops/skills/common/code-review/SKILL.md`를 기준선으로 삼아 내용을 보존하며 변경을 겹쳐 적용한다.
- 사용자 소유의 `.clinerules` 변경과 `agent-task/archive/2026/07/m-stream-evidence-gate-core/` artifact rename은 범위 밖이며 수정하지 않는다.

### 최종 라우팅

- `evaluation_mode=first-pass`
- `finalizer=finalize-task-policy.sh`, `finalizer_mode=pair`
- Build closures: scope/context/verification/evidence/ownership/decision 모두 `true`
- Build grade scores: scope=2, state=1, blast=1, evidence=1, verification=1, total=`G06`
- Build base/final route: `local-fit`, `local`, `PLAN-local-G06.md`
- Review closures: scope/context/verification/evidence/ownership/decision 모두 `true`
- Review grade scores: scope=2, state=1, blast=1, evidence=1, verification=1, total=`G06`
- Review route: `official-review`, `cloud`, Codex `gpt-5.6-sol` xhigh, `CODE_REVIEW-cloud-G06.md`
- `large_indivisible_context=false`
- Positive loop risks: `boundary_contract`, `structured_interpretation`, `variant_product`; count=3
- `review_rework_count=0`, `evidence_integrity_failure=false`
- Capability gap: none

## 구현 체크리스트

- [ ] [REFACTOR-1] 새 PLAN/CODE_REVIEW pair의 전체 model-facing schema와 작성 지시를 영어 canonical 형식으로 전환하고, 현재 legacy pair의 종료 호환 규칙을 문서화한다.
- [ ] [REFACTOR-2] orchestrator prompt와 dispatcher parser를 영어 canonical·한국어 legacy dual-read 계약으로 갱신하고 semantic 중복은 fail-closed 처리한다.
- [ ] [REFACTOR-3] canonical, legacy, duplicate, recovery, prompt-language 경계를 회귀 tests로 고정하고 전체 dispatcher suite를 통과한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

### [REFACTOR-1] Canonical English generation and legacy finalization

#### 문제

`agent-ops/skills/common/plan/SKILL.md:236-290`은 새 PLAN의 필수 schema를 한국어 heading으로 정의하고, `agent-ops/skills/common/code-review/SKILL.md:181-193`은 review verdict를 한국어로 append하도록 요구한다. `agent-ops/skills/common/plan/templates/review-stub-template.md:14-100`도 구현·리뷰 에이전트가 읽고 채우는 섹션 대부분을 한국어로 생성한다.

Before (`agent-ops/skills/common/plan/templates/review-stub-template.md:14-22`):

```markdown
## 개요

date={date}
task={task_name}, plan={plan_number}, tag={TAG}

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

이 상태에서는 영어 control prompt와 한국어 artifact schema가 한 task context에 섞인다.

#### 해결 방법

새 pair가 생성하는 PLAN과 CODE_REVIEW의 heading, table label, placeholder, implementation/review instruction을 영어로 통일한다. canonical mapping은 다음과 같다.

| Legacy read alias | Canonical write label |
|---|---|
| `이 파일을 읽는 구현 에이전트에게` | `For the Implementing Agent` |
| `배경` | `Background` |
| `분석 결과` | `Analysis` |
| `구현 체크리스트` | `Implementation Checklist` |
| `수정 파일 요약` | `Modified Files Summary` |
| `최종 검증` | `Final Verification` |
| `개요` | `Overview` |
| `구현 항목별 완료 여부` | `Implementation Item Completion` |
| `코드리뷰 전용 체크리스트` | `Review-Only Checklist` |
| `계획 대비 변경 사항` | `Deviations from Plan` |
| `주요 설계 결정` | `Key Design Decisions` |
| `리뷰어를 위한 체크포인트` | `Reviewer Checkpoints` |
| `검증 결과` | `Verification Results` |
| `섹션 소유권` | `Section Ownership` |
| `코드리뷰 결과` | `Code Review Result` |
| `종합 판정` | `Overall Verdict` |
| `차원별 평가` | `Dimension Assessment` |
| `발견된 문제` | `Findings` |
| `라우팅 신호` | `Routing Signals` |
| `다음 단계` | `Next Step` |

After:

```markdown
## Overview

date={date}
task={task_name}, plan={plan_number}, tag={TAG}

## For the Review Agent
```

`Roadmap Targets`, `Archive Evidence Snapshot`, `Agent UI Completion`, filenames, identity header, status tokens은 그대로 유지한다. plan/code-review skill 자체의 사람-facing trigger와 roadmap/control-plane 한국어 literal은 필요한 곳에 유지하되, 새 active pair에 복사되는 schema와 prose는 영어로 작성하게 한다.

Migration bootstrap은 다음처럼 고정한다.

1. 새 PLAN/CODE_REVIEW pair는 영어만 생성한다.
2. 이미 active인 legacy 한국어 review는 legacy heading을 기준으로 한국어 verdict를 append해 이전 dispatcher process도 종료를 인식하게 한다.
3. 영어 active review는 영어 verdict를 append한다.
4. archive는 재작성하지 않고, 후속 새 pair부터 영어 canonical을 사용한다.

#### 수정 파일 및 체크리스트

- [ ] `agent-ops/skills/common/plan/SKILL.md`: required plan schema, item subsection, mandatory checklist sentence, verification evidence field를 영어 canonical write 계약으로 변경한다.
- [ ] `agent-ops/skills/common/code-review/SKILL.md`: canonical verdict와 implementation field 이름을 영어로 변경하고 legacy active pair의 schema-preserving finalization을 명시한다.
- [ ] `agent-ops/skills/common/plan/templates/review-stub-template.md`: known token은 유지하면서 전체 model-facing 고정 text와 section/table label을 영어로 변환한다.
- [ ] 현재 파일에 있는 사용자 조정 내용을 보존하고 언어 계약 변경만 겹쳐 적용한다.

#### 테스트 작성

작성한다. `REFACTOR-3`에서 template의 영어 canonical narrative/heading, code span의 허용된 한국어 protocol literal, skill의 canonical write label, legacy finalization 문구를 회귀 검증한다.

#### 중간 검증

```bash
rg -n --sort path 'Overview|For the Review Agent|Implementation Checklist|Modified Files Summary|Code Review Result|Overall Verdict' agent-ops/skills/common/plan/SKILL.md agent-ops/skills/common/code-review/SKILL.md agent-ops/skills/common/plan/templates/review-stub-template.md
```

Expected: 각 canonical label이 생성 계약 또는 template에 나타나며 unresolved template token inventory는 바뀌지 않는다.

### [REFACTOR-2] Dual-read runtime and explicit artifact-language prompts

#### 문제

`dispatch.py`는 세 runtime decision을 한국어 exact literal에 결합한다.

Before (`agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py:62-69`):

```python
VERDICT_HEADING_RE = re.compile(r"^## 코드리뷰 결과[ \t]*$", re.MULTILINE)
VERDICT_LINE_RE = re.compile(
    r"^(?:-\s*)?(?:\*\*)?종합 판정(?:\*\*)?\s*:\s*(PASS|WARN|FAIL)[ \t]*$",
    re.MULTILINE,
)
```

`extract_write_set`은 `dispatch.py:940`의 `## 수정 파일 요약`, self-check는 `dispatch.py:2086`의 `구현 체크리스트`, verdict recovery는 `dispatch.py:4329-4340`의 한국어 regex만 인식한다. Orchestrator contract도 `SKILL.md:89,104,153`에서 같은 literal만 설명하며, prompt는 `Final in Korean.`이 artifact와 응답 언어의 차이를 명시하지 않는다.

#### 해결 방법

semantic field마다 canonical-first accepted heading/label tuple을 한 곳에 정의하고 기존 parser 함수 이름은 유지한다.

```python
MODIFIED_FILES_HEADINGS = ("Modified Files Summary", "수정 파일 요약")
IMPLEMENTATION_CHECKLIST_HEADINGS = ("Implementation Checklist", "구현 체크리스트")
CODE_REVIEW_RESULT_HEADINGS = ("Code Review Result", "코드리뷰 결과")
OVERALL_VERDICT_LABELS = ("Overall Verdict", "종합 판정")
```

- `extract_write_set`: accepted semantic section이 정확히 하나일 때만 table을 읽는다. 없음 또는 canonical+legacy 중복이면 `(set(), False)`로 fail-closed 한다.
- `markdown_section`/`implementation_review_errors`: accepted checklist section이 정확히 하나일 때만 checkbox를 평가한다. 중복은 incomplete다.
- `verdict_from_text`: accepted result section이 정확히 하나이고 그 안에 accepted verdict field가 정확히 하나일 때만 반환한다. 다른 section의 verdict-like text는 무시하며 중복·충돌은 `None`이다.
- Active/log recovery 모두 같은 aliases를 사용한다. `USER_REVIEW.md` parser와 한국어 milestone-lock literal은 변경하지 않는다.
- worker/self-check/review prompt에 artifact content는 영어로 유지한다는 짧은 문장을 추가하고 `Final in Korean.`은 child의 최종 응답 언어로 유지한다.
- orchestrator skill에는 canonical write, legacy read, schema-preserving legacy verdict 규칙을 exact protocol literal로 기록한다.

#### 수정 파일 및 체크리스트

- [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py`: semantic alias와 singular-section parser를 적용한다.
- [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py`: prompt에 artifact-language/final-response-language 경계를 명시한다.
- [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md`: write-set, self-check, verdict, prompt 계약을 canonical+legacy 규칙과 동기화한다.
- [ ] `USER_REVIEW`, WORK_LOG, complete-log, banner/status parsing은 수정하지 않는다.

#### 테스트 작성

작성한다. `REFACTOR-3`에서 parser 정상·legacy·중복·outside-section 및 exact prompt를 검증한다.

#### 중간 검증

```bash
python3 -m py_compile agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py
```

Expected: exit code 0, stdout/stderr 없음.

### [REFACTOR-3] Contract regression matrix

#### 문제

`test_dispatch.py:166-184`, `357-381`, `4695-4803`은 verdict, self-check, write-set/recovery를 한국어 fixture로만 검증한다. `test_dispatch.py:3247-3271`의 prompt exact match에도 artifact language 분리가 없고, template 검증은 control-plane text 부재만 확인한다.

Before (`agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py:176-184`):

```python
def test_exact_official_verdict_section_starts_review_recovery(self):
    task = self.make_task(
        root,
        "## 코드리뷰 결과\n"
        "- **종합 판정**: WARN\n",
    )
```

#### 해결 방법

기존 test layout과 provider deny guard를 유지하고 `ArtifactLanguageContractTest`를 추가한다. 일반 happy-path fixture는 영어 canonical로 전환하고, 한국어 fixture는 이름에 `legacy`를 명시해 호환성 증거로 남긴다.

검증 matrix:

| Case | Expected |
|---|---|
| English PLAN `Modified Files Summary` | normalized write-set known |
| Korean PLAN `수정 파일 요약` | same write-set known |
| English `Implementation Checklist` empty/filled | incomplete/complete |
| Korean `구현 체크리스트` filled | complete |
| English `Code Review Result` + `Overall Verdict` | stage/recovery verdict recognized |
| Korean legacy result/verdict | recognized |
| canonical+legacy duplicate semantic section | fail-closed |
| verdict-like text outside result section | ignored |
| English and Korean archived plan/review logs | identity-matching recovery works |
| review template | canonical English narrative/heading; 한국어는 명시된 code-span protocol literal만 허용 |
| prompts | artifact English instruction present, `Final in Korean.` retained |

#### 수정 파일 및 체크리스트

- [ ] `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py`: `ArtifactLanguageContractTest`와 위 matrix를 추가한다.
- [ ] 기존 parser tests의 primary fixture를 영어 canonical로 바꾸고 별도 legacy cases를 유지한다.
- [ ] 실제 `pi`, `agy`, `claude`, `codex` provider invocation 또는 command construction을 호출하지 않는다.
- [ ] 전체 dispatcher test suite의 기존 262 tests와 새 tests를 함께 실행한다.

#### 테스트 작성

작성한다.

- Path: `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py`
- Tests:
  - `ArtifactLanguageContractTest.test_canonical_english_sections_drive_runtime_contract`
  - `ArtifactLanguageContractTest.test_legacy_korean_sections_remain_readable`
  - `ArtifactLanguageContractTest.test_duplicate_language_aliases_fail_closed`
  - `ArtifactLanguageContractTest.test_recovery_accepts_canonical_and_legacy_logs`
  - `ArtifactLanguageContractTest.test_templates_and_prompts_separate_artifact_and_final_languages`
- Fixtures: `tempfile.TemporaryDirectory`, synthetic PLAN/CODE_REVIEW text, existing `TaskStageTest.make_task`; network/provider 없음.

#### 중간 검증

```bash
python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py ArtifactLanguageContractTest
```

Expected: listed class tests all PASS, provider invocation 없음.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `agent-ops/skills/common/plan/SKILL.md` | REFACTOR-1 |
| `agent-ops/skills/common/code-review/SKILL.md` | REFACTOR-1 |
| `agent-ops/skills/common/plan/templates/review-stub-template.md` | REFACTOR-1 |
| `agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md` | REFACTOR-2 |
| `agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py` | REFACTOR-2 |
| `agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py` | REFACTOR-3 |

## 최종 검증

```bash
python3 -m py_compile agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py
```

Expected: exit code 0, stdout/stderr 없음.

```bash
python3 agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py ArtifactLanguageContractTest
```

Expected: focused language-contract tests all PASS, 실제 provider 호출 없음.

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

Expected: 기존 262 tests와 새 tests 모두 PASS. Python unittest에는 cache 허용 여부가 적용되지 않는다.

```bash
git diff --check
```

Expected: exit code 0.

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