<!-- task=m-ops-rule-monorepo-alignment/02+01_test_rules plan=0 tag=RULES -->

# Plan - RULES Local Test Rule Monorepo Alignment

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

`CODE_REVIEW-local-G04.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이 필수다. 구현 후 검증을 실행하고 active 파일을 그대로 둔 채 리뷰 준비를 보고한다. 최종 판정, log rename, `complete.log`, archive 이동은 code-review skill 책임이다. 사용자만 결정할 수 있는 차단, 사용자 소유 외부 환경, 범위 충돌이 생기면 review stub의 `사용자 리뷰 요청` 섹션에 정확한 근거를 채우고 멈춘다. 구현 중 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해결할 수 있는 증거 공백은 사용자 리뷰 요청이 아니다.

## 배경

local smoke 문서는 아직 root `lib/`, `bin/main.dart`, `assets/` 경로와 package-local 명령을 섞어 설명한다. 현재 workspace 검증은 `Makefile`의 `runner-*`, `client-*`, `core-test` target과 package별 working directory를 기준으로 실행된다. 이 plan은 domain rule 정리 완료 후 local test rule과 smoke profile의 읽기 조건 및 명령을 모노레포 target 이름과 맞춘다.

## 사용자 리뷰 요청 흐름

구현 중 차단은 active `CODE_REVIEW-local-G04.md`의 `사용자 리뷰 요청` 섹션에 기록한다. 직접 사용자 프롬프트는 금지하며, code-review가 요청 타당성을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/ops-rule-monorepo-alignment.md`
- Task ids:
  - `test-rules`: local test rule과 smoke 문서가 모노레포 target 이름과 일치하는지 확인한다.
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-ops/rules/common/philosophy.md`
- `agent-ops/rules/project/rules.md`
- `agent-roadmap/current.md`
- `agent-roadmap/phase/independent-control-plane/milestones/ops-rule-monorepo-alignment.md`
- `agent-test/local/rules.md`
- `agent-test/local/agent-smoke.md`
- `agent-test/local/cli-smoke.md`
- `agent-test/local/command-smoke.md`
- `agent-test/local/core-smoke.md`
- `agent-test/local/framework-smoke.md`
- `agent-test/local/pipeline-smoke.md`
- `agent-test/local/sample-smoke.md`
- `agent-test/local/scheduler-smoke.md`
- `Makefile`
- `apps/runner/pubspec.yaml`
- `apps/client/pubspec.yaml`
- `packages/flutter/oto_console/pubspec.yaml`
- `services/core/go.mod`

### 테스트 환경 규칙

- test_env: `local`
- `agent-test/local/rules.md`는 존재하고 읽었다.
- matched profiles: 모든 local smoke profile을 읽었다. 이 plan 자체가 smoke profile 정리 작업이다.
- fallback verification: `Makefile` target과 package manifest를 근거로 명령을 정리한다.
- `<확인 필요>` 값: 없음.

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

- test rule 문서 정리는 unit test가 직접 검증하지 않는다.
- 검증은 stale read condition 검색, `Makefile` target 이름과 smoke 문서 명령 대조, `git diff --check`로 수행한다.

### 심볼 참조

- none. 코드 symbol rename/remove가 아니다.

### 분할 판단

- split decision policy를 먼저 평가했다.
- shared task group: `m-ops-rule-monorepo-alignment`
- predecessor: `01_domain_rules`
- predecessor completion: archive `agent-task/archive/2026/06/m-ops-rule-monorepo-alignment/01_domain_rules/complete.log`를 확인했다. 구현 시작이 가능하다.
- 이 dependency는 subtask directory name `02+01_test_rules`가 source of truth다.

### 범위 결정 근거

- domain rule 내부 경로 수정은 predecessor plan이 담당한다.
- production code, test code, `docs/`, archive 문서는 수정하지 않는다.
- 실제 검증 명령을 실행해 pass/fail을 바꾸는 작업이 아니라, 문서의 라우팅과 명령 계약을 현재 모노레포 target으로 맞추는 작업이다.

### 빌드 등급

- `local-G04`: 문서 전용 변경이지만 모든 local smoke profile을 함께 맞추고 predecessor 결과와 Makefile target을 대조해야 한다.

## 구현 체크리스트

- [ ] predecessor `01_domain_rules`의 `complete.log`가 active 또는 archive 경로에 있는지 확인하고 없으면 구현을 시작하지 않고 review stub의 사용자 리뷰 요청이 아니라 dependency 미충족으로 기록한다.
- [ ] `agent-test/local/*-smoke.md`의 읽기 조건을 `apps/runner/...` 경로로 갱신하고, package-local 명령은 working directory 또는 `make` target 의미가 분명하게 보이도록 정리한다.
- [ ] `agent-test/local/rules.md`의 라우팅 설명이 runner/client/core package target과 충돌하지 않는지 확인한다.
- [ ] `rg --sort path -n 'lib/|bin/main|assets/' agent-test/local` 결과의 남은 항목이 모두 의도된 예외인지 확인한다.
- [ ] `git diff --check`를 실행해 markdown whitespace 오류가 없는지 확인한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 의존 관계 및 구현 순서

- `02+01_test_rules`는 같은 task group의 `01_domain_rules` 완료에 의존한다.
- 구현 전 확인 대상:
  - active: `agent-task/m-ops-rule-monorepo-alignment/01_domain_rules/complete.log`
  - archive: `agent-task/archive/*/*/m-ops-rule-monorepo-alignment/01_domain_rules/complete.log`

### [RULES-1] Local smoke read conditions and commands

#### 문제

`agent-test/local/agent-smoke.md:13`, `cli-smoke.md:13`, `command-smoke.md:13`, `core-smoke.md:13`, `pipeline-smoke.md:13`, `sample-smoke.md:13`, `scheduler-smoke.md:13`은 root `lib/`, `bin/main.dart`, `assets/` 경로를 읽기 조건으로 사용한다. `Makefile`은 package working directory 기반 `runner-analyze`, `runner-test`, `client-analyze`, `client-test`, `core-test` target을 제공한다.

#### 해결 방법

예시:

```markdown
Before:
- `lib/oto/agent/**`, `lib/cli/commands/command_agent.dart`, 또는 `assets/script/shell/oto_agent_bootstrap.sh` 변경 검증이 필요한 경우

After:
- `apps/runner/lib/oto/agent/**`, `apps/runner/lib/cli/commands/command_agent.dart`, 또는 `apps/runner/assets/script/shell/oto_agent_bootstrap.sh` 변경 검증이 필요한 경우
```

각 smoke profile의 read condition을 domain rule의 최종 경로와 맞추고, 명령은 package-local 실행인지 `make` target인지 헷갈리지 않게 쓴다.

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

- [ ] `agent-test/local/agent-smoke.md`
- [ ] `agent-test/local/cli-smoke.md`
- [ ] `agent-test/local/command-smoke.md`
- [ ] `agent-test/local/core-smoke.md`
- [ ] `agent-test/local/framework-smoke.md`
- [ ] `agent-test/local/pipeline-smoke.md`
- [ ] `agent-test/local/sample-smoke.md`
- [ ] `agent-test/local/scheduler-smoke.md`

#### 테스트 작성

문서 라우팅 정리이므로 unit test는 작성하지 않는다.

#### 중간 검증

```bash
rg --sort path -n 'lib/|bin/main|assets/' agent-test/local
```

예상: 남은 root 경로가 있으면 제거하거나 의도된 예외로 명시한다.

### [RULES-2] Local routing and monorepo target consistency

#### 문제

`agent-test/local/rules.md`는 domain smoke profile만 나열하고, package별 target 이름과 현재 `Makefile`의 runner/client/core split이 어떻게 연결되는지 분명히 말하지 않는다. `framework-smoke.md:13`도 root manifest만 전제로 한다.

#### 해결 방법

`agent-test/local/rules.md`에 runner/client/core package target 기준을 짧게 추가하고, framework profile은 `apps/runner/pubspec.yaml`, `apps/client/pubspec.yaml`, `packages/flutter/oto_console/pubspec.yaml`, `services/core/go.mod`, `proto/**` 같은 manifest/proto 경계를 읽기 조건으로 둔다.

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

- [ ] `agent-test/local/rules.md`
- [ ] `agent-test/local/framework-smoke.md`
- [ ] 필요 시 다른 smoke profile의 명령 설명

#### 테스트 작성

문서 라우팅 정리이므로 unit test는 작성하지 않는다.

#### 중간 검증

```bash
rg --sort path -n 'runner-analyze|runner-test|client-analyze|client-test|core-test|apps/runner|apps/client|services/core|packages/flutter/oto_console' agent-test/local Makefile
```

예상: smoke 문서와 `Makefile` target 이름이 같은 의미로 읽힌다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `agent-test/local/rules.md` | RULES-2 |
| `agent-test/local/agent-smoke.md` | RULES-1 |
| `agent-test/local/cli-smoke.md` | RULES-1 |
| `agent-test/local/command-smoke.md` | RULES-1 |
| `agent-test/local/core-smoke.md` | RULES-1 |
| `agent-test/local/framework-smoke.md` | RULES-1, RULES-2 |
| `agent-test/local/pipeline-smoke.md` | RULES-1 |
| `agent-test/local/sample-smoke.md` | RULES-1 |
| `agent-test/local/scheduler-smoke.md` | RULES-1 |

## 최종 검증

```bash
test -f agent-task/m-ops-rule-monorepo-alignment/01_domain_rules/complete.log || find agent-task/archive -path '*/m-ops-rule-monorepo-alignment/01_domain_rules/complete.log' -print -quit | grep -q .
rg --sort path -n 'lib/|bin/main|assets/' agent-test/local
rg --sort path -n 'runner-analyze|runner-test|client-analyze|client-test|core-test|apps/runner|apps/client|services/core|packages/flutter/oto_console' agent-test/local Makefile
git diff --check
```

첫 번째 명령은 predecessor `complete.log`가 active 또는 archive 경로에 있을 때만 성공해야 한다. 남은 root 경로는 의도된 예외여야 하고, `git diff --check`는 출력 없이 성공해야 한다.

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