<!-- task=m-agent-readable-repository-refactor/14_repository_regression plan=0 tag=TEST -->

# Repository Regression Verification Plan

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

이 Plan은 저장소 전체의 결정적 회귀 evidence를 수집하는 단계다. 검증 명령을 실행하고 실제 출력 또는 `/tmp` 로그 경로를 `CODE_REVIEW-local-G06.md`의 구현 에이전트 소유 섹션에 기록한 뒤 active 파일을 그대로 두고 review 준비 완료를 보고한다. 최종 판정, 로그 rename, `complete.log`, archive 이동은 code-review 스킬 전용이다.

선택된 Milestone의 `구현 잠금 > 결정 필요`가 실구현을 차단할 때만 review stub의 `사용자 리뷰 요청`에 연결 근거를 기록하고 중단한다. 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하거나 `USER_REVIEW.md`·`complete.log`를 만들지 않는다. 환경·secret·서비스 blocker, 일반 범위 변경, 후속 agent가 채울 수 있는 evidence 공백은 사용자 리뷰 요청이 아니다.

## 배경

`agent-readable-repository-refactor`의 남은 `regression`은 저장소 전체 Go, Flutter, readability 회귀와 실제 프로세스 full-cycle을 요구한다. 검증 전략과 실패 위험이 다른 두 단계로 나누며, 이 단계는 현재 checkout 안에서 결정적으로 재현 가능한 Go/Flutter/readability 회귀 evidence만 소유한다.

## 사용자 리뷰 요청 흐름

구현 중 직접 사용자 입력을 요청하지 않는다. 선택된 Milestone 잠금 결정만 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md` 형식으로 active review stub에 기록하고, 실제 `USER_REVIEW.md` 작성 여부는 code-review가 판정한다.

## 분석 결과

### 읽은 파일

- `agent-roadmap/current.md`
- `agent-roadmap/priority-queue.md`
- `agent-roadmap/phase/automation-runtime-bridge/PHASE.md`
- `agent-roadmap/phase/automation-runtime-bridge/milestones/agent-readable-repository-refactor.md`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-test/local/rules.md`
- `agent-test/local/testing-smoke.md`
- `agent-test/local/edge-smoke.md`
- `agent-test/local/node-smoke.md`
- `agent-test/local/control-plane-smoke.md`
- `agent-test/local/client-smoke.md`
- `agent-test/local/platform-common-smoke.md`
- `Makefile`

### SDD 기준

Milestone의 SDD는 불필요하다. 외부 API/proto/config schema나 runtime 책임 경계를 바꾸지 않는 동작 보존형 리팩터링이라는 기존 사유를 따른다.

### 테스트 환경 규칙

- `test_env`: `local`
- `agent-test/local/rules.md`를 읽었고 testing, edge, node, control-plane, client, platform-common smoke profile을 모두 매칭했다.
- 현재 runner는 `/config/workspace/iop`, branch `main`, preflight HEAD `be05139b5be6a7938ac102aaf0664ed08e4cebe3`, dirty worktree다. 기존 사용자 변경을 보존하고 검증만 실행한다.
- Go `1.26.2`, Flutter `3.41.5`, GNU Make와 Bash가 확인됐다.
- 이 단계는 외부 checkout, Docker, provider, emulator/device를 사용하지 않는다.
- fresh Go evidence가 필요하므로 `-count=1`과 `/tmp` 전용 `GOCACHE`를 사용한다. 긴 출력은 `/tmp/iop-agent-readable-repository-regression/`에 저장하며 repo 안에 도구나 로그를 생성하지 않는다.

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

- 동작 변경은 없다.
- `go test -count=1 ./...`가 전체 Go package 회귀를 다룬다.
- `make client-test`와 `flutter analyze`가 Flutter widget/wire 회귀와 정적 분석을 다룬다.
- readability 단위 테스트와 worktree ratchet이 common 제외, baseline, read-set 정합성을 다룬다.
- 실제 프로세스 lifecycle과 외부 CLI profile은 이 단계의 범위가 아니며 후속 `15+14_runtime_full_cycle`이 소유한다.

### 심볼 참조

none. 심볼을 변경하거나 제거하지 않는다.

### 분할 판단

분할 정책을 Plan 파일 선택 전에 적용했다. 공통 task group은 `m-agent-readable-repository-refactor`다.

- `14_repository_regression`: checkout 내부 Go/Flutter/readability 회귀. 선행 의존 없음.
- `15+14_runtime_full_cycle`: 실제 Edge/Node/Control Plane 프로세스와 외부 CLI 검증. `14_repository_regression`의 `complete.log`에 의존한다.

이 하위 단계 안의 Go/Flutter/readability 명령은 모두 비변경 evidence 수집이며 하나의 checkout 상태를 증명한다. 별도 subtask로 더 나누면 같은 HEAD/dirty-state evidence가 분산되고 유용한 중간 구현 결과가 없으므로 단일 Plan이 더 안전하다.

### 범위 결정 근거

- production/test source, contract, spec, roadmap 상태는 수정하지 않는다.
- `agent-ops/rules/common/**`와 `agent-ops/skills/common/**`는 읽기·수정·readability 측정 대상에서 제외한다.
- 테스트 실패를 고치지 않는다. 실패가 나오면 실제 출력과 최초 실패 지점을 review stub에 기록하고 code-review 후속 Plan으로 넘긴다.
- runtime E2E/full-cycle과 실제 외부 CLI는 후속 subtask에 남긴다.

### 빌드 등급

`local-G06`. 변경 없는 결정적 repository regression이며 명령과 PASS 기준이 명확하지만 Go/Flutter/readability 전체 evidence 양이 크다.

## 구현 체크리스트

- [ ] `/tmp/iop-agent-readable-repository-regression`에 fresh 로그 디렉터리를 만들고 branch, HEAD, dirty-state preflight를 기록한다.
- [ ] fresh `go test -count=1 ./...`, `make client-test`, `flutter analyze`를 실행하고 각 종료 상태와 원본 출력 경로를 기록한다.
- [ ] readability 단위 테스트와 worktree ratchet을 실행하고 common 경로가 audit/read-set 결과에 포함되지 않는지 검증한다.
- [ ] `git diff --check`를 실행하고 검증 전후 HEAD가 같으며 검증 명령이 tracked 파일을 추가로 바꾸지 않았는지 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [TEST-1] Checkout 내부 전체 회귀 evidence 수집

#### 문제

[Milestone의 `regression` Task](../../../agent-roadmap/phase/automation-runtime-bridge/milestones/agent-readable-repository-refactor.md)는 전체 Go/Flutter 회귀를 요구하지만 active task에는 한 HEAD에서 재현한 최종 evidence가 없다.

#### 해결 방법

코드 변경 없이 현재 checkout의 branch/HEAD/dirty state를 먼저 고정하고, official Makefile과 readability entrypoint를 fresh 실행한다. 각 pipeline은 `set -o pipefail`로 실제 명령 종료 상태를 보존한다.

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

- [ ] tracked source 수정 없음
- [ ] `CODE_REVIEW-local-G06.md`: 실제 명령, 종료 상태, `/tmp` 로그 경로 기록

#### 테스트 작성

새 테스트를 작성하지 않는다. 이 작업 자체가 기존 전체 테스트와 audit을 fresh 실행해 보존 여부를 판정하는 verification task다.

#### 중간 검증

```bash
mkdir -p /tmp/iop-agent-readable-repository-regression
git branch --show-current
git rev-parse HEAD
git status --short
set -o pipefail; GOCACHE=/tmp/iop-agent-readable-repository-regression/go-cache go test -count=1 ./... 2>&1 | tee /tmp/iop-agent-readable-repository-regression/go-test.log
set -o pipefail; make client-test 2>&1 | tee /tmp/iop-agent-readable-repository-regression/client-test.log
set -o pipefail; (cd apps/client && flutter analyze) 2>&1 | tee /tmp/iop-agent-readable-repository-regression/flutter-analyze.log
```

기대 결과: 모든 명령이 종료 코드 0이며 Go는 모든 package PASS, Flutter는 모든 test PASS와 analyze issue 0을 보고한다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `CODE_REVIEW-local-G06.md` | TEST-1 실제 evidence 기록 |

## 최종 검증

```bash
set -o pipefail; python3 -m unittest scripts.readability_audit_test 2>&1 | tee /tmp/iop-agent-readable-repository-regression/readability-unit.log
python3 scripts/readability_audit.py --check --input-mode worktree --output /tmp/iop-agent-readable-repository-regression/readability.json
python3 - <<'PY'
import json
from pathlib import Path

report = json.loads(Path("/tmp/iop-agent-readable-repository-regression/readability.json").read_text())
blocked = ("agent-ops/rules/common/", "agent-ops/skills/common/")
paths = [row["path"] for row in report["files"]]
paths += [row["path"] for row in report["violations"]]
for read_set in report["task_read_sets"]:
    paths += [row["path"] for row in read_set["files"]]
assert not any(path.startswith(blocked) for path in paths)
print("common-boundary-excluded=PASS")
PY
git diff --check
git rev-parse HEAD
git status --short
```

기대 결과: 122개 readability 단위 테스트 PASS, ratchet PASS, `common-boundary-excluded=PASS`, whitespace 오류 없음, preflight와 동일 HEAD다.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
