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

# Plan - RULES Domain Rule Monorepo Alignment

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

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

## 배경

상위 프로젝트 규칙은 모노레포 구조로 일부 정리되었지만, domain rule 내부는 아직 root `lib/`, `bin/main.dart`, `assets/` 경로를 기준으로 설명한다. 이 상태에서는 코드 변경 전 읽어야 할 domain rule이 실제 파일 위치와 어긋난다. 이 plan은 domain rule의 경로와 책임 경계 설명을 현재 `apps/runner`, `apps/client`, `services/core`, `packages/flutter/oto_console` 구조에 맞춘다.

## 사용자 리뷰 요청 흐름

구현 중 차단은 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:
  - `domain-paths`: domain rule의 파일 경로 예시와 책임 경계 설명이 현재 코드 위치와 맞는지 검토해 갱신한다.
- 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/PHASE.md`
- `agent-roadmap/phase/independent-control-plane/milestones/ops-rule-monorepo-alignment.md`
- `agent-ops/rules/project/domain/agent/rules.md`
- `agent-ops/rules/project/domain/cli/rules.md`
- `agent-ops/rules/project/domain/command/rules.md`
- `agent-ops/rules/project/domain/core/rules.md`
- `agent-ops/rules/project/domain/framework/rules.md`
- `agent-ops/rules/project/domain/pipeline/rules.md`
- `agent-ops/rules/project/domain/sample/rules.md`
- `agent-ops/rules/project/domain/scheduler/rules.md`
- `Makefile`
- `apps/runner/pubspec.yaml`
- `apps/runner/analysis_options.yaml`
- `apps/client/pubspec.yaml`
- `apps/client/analysis_options.yaml`
- `packages/flutter/oto_console/pubspec.yaml`
- `services/core/go.mod`

### 테스트 환경 규칙

- test_env: `local`
- `agent-test/local/rules.md`는 존재하고 읽었다.
- 이 plan은 domain rule 문서 갱신이며 production 코드나 테스트 코드를 변경하지 않는다.
- matched profile: 없음. 변경 대상은 `agent-ops/rules/project/domain/**/rules.md` 문서다.
- fallback verification: deterministic `rg --sort path` 검색과 `git diff --check`.

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

- domain rule 문서 경로 갱신은 기존 unit test가 직접 검증하지 않는다.
- 검증은 stale path 검색, 현재 파일 존재 여부 대조, markdown diff whitespace 확인으로 수행한다.

### 심볼 참조

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

### 분할 판단

- split decision policy를 먼저 평가했다.
- shared task group: `m-ops-rule-monorepo-alignment`
- `01_domain_rules`: domain rule 내부의 경로와 책임 경계 정리. depends_on 없음.
- `02+01_test_rules`: local smoke 문서와 검증 명령 정리. `01_domain_rules` 완료 후 진행해야 한다.
- 이 plan은 `01_domain_rules`이므로 predecessor completion은 필요 없다.

### 범위 결정 근거

- `agent-test/local/*-smoke.md`는 이 plan에서 수정하지 않는다. domain 경로가 먼저 정리된 뒤 smoke 문서를 그 결과에 맞추는 것이 리뷰 가능하다.
- production code, `docs/`, archive 문서는 수정하지 않는다.
- dedicated domain rule이 없는 `apps/client/lib/**`, `packages/flutter/oto_console/lib/**`, `services/core/internal/**`은 기존 runner domain rule에 억지로 편입하지 않는다. 필요하면 별도 domain rule 생성 또는 후속 milestone으로 남긴다.

### 빌드 등급

- `local-G04`: 문서 전용 변경이지만 8개 domain rule의 경계와 path contract를 함께 맞추므로 중간 수준의 정합성 검토가 필요하다.

## 구현 체크리스트

- [ ] `agent-ops/rules/project/domain/**/rules.md`의 root `lib/`, `bin/main.dart`, root `assets/` 경로를 현재 `apps/runner/...` 경로로 갱신하고, legacy/external exception은 명시한다.
- [ ] `framework` rule이 runner/client/console/core service의 package/toolchain/proto 경계만 담당하도록 설명을 정리하고, dedicated domain rule이 없는 구현 경로를 기존 domain으로 단정하지 않는다.
- [ ] `rg --sort path -n 'lib/|bin/main|assets/' agent-ops/rules/project/domain` 결과의 남은 항목이 모두 의도된 legacy/external exception인지 확인한다.
- [ ] `git diff --check`를 실행해 markdown whitespace 오류가 없는지 확인한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [RULES-1] Runner domain path prefixes

`agent-ops/rules/project/domain/agent/rules.md:16`, `cli/rules.md:16`, `command/rules.md:16`, `core/rules.md:16`, `pipeline/rules.md:16`, `sample/rules.md:17`, `scheduler/rules.md:16` 등 다수 항목이 root `lib/`, `bin/main.dart`, `assets/`를 현재 위치로 안내한다.

#### 문제

상위 project rule은 `apps/runner` 구조를 가리키지만 domain rule 내부 포함/제외 경로와 주요 구성 요소는 root package 시절 경로를 유지한다.

#### 해결 방법

예시:

```markdown
Before:
- `lib/oto/pipeline/` — 파이프라인 실행 엔진 전체

After:
- `apps/runner/lib/oto/pipeline/` — 파이프라인 실행 엔진 전체
```

`agent`, `cli`, `command`, `core`, `pipeline`, `sample`, `scheduler` rule의 포함/제외 경로, 구성 요소 표, 유지 패턴의 파일 경로를 `apps/runner/...`로 정리한다.

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

- [ ] `agent-ops/rules/project/domain/agent/rules.md`
- [ ] `agent-ops/rules/project/domain/cli/rules.md`
- [ ] `agent-ops/rules/project/domain/command/rules.md`
- [ ] `agent-ops/rules/project/domain/core/rules.md`
- [ ] `agent-ops/rules/project/domain/pipeline/rules.md`
- [ ] `agent-ops/rules/project/domain/sample/rules.md`
- [ ] `agent-ops/rules/project/domain/scheduler/rules.md`

#### 테스트 작성

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

#### 중간 검증

```bash
rg --sort path -n 'lib/|bin/main|assets/' agent-ops/rules/project/domain
```

예상: 남은 root 경로가 있으면 제거하거나 `lib/framework/` 제거 사실처럼 의도된 legacy/external exception으로 문장 안에서 명시한다.

### [RULES-2] Framework and non-runner boundary wording

#### 문제

`agent-ops/rules/project/domain/framework/rules.md:16`은 root `pubspec.yaml`과 `analysis_options.yaml`만 포함한다고 말하지만 실제 package/toolchain 파일은 `apps/runner`, `apps/client`, `packages/flutter/oto_console`, `services/core`에 있다.

#### 해결 방법

예시:

```markdown
Before:
- `pubspec.yaml` — `dart_framework` 외부 Git 의존성 선언

After:
- `apps/runner/pubspec.yaml` — runner Dart dependency와 `dart_framework` Git 의존성
- `apps/client/pubspec.yaml` — Flutter client dependency
- `packages/flutter/oto_console/pubspec.yaml` — embeddable console package dependency
- `services/core/go.mod` — Go core service dependency
```

framework rule은 package manifest, analyzer/lint, protobuf generation, 외부 dependency 경계만 담당한다고 못박는다. `apps/client/lib/**`, `packages/flutter/oto_console/lib/**`, `services/core/internal/**`의 behavior rule은 기존 runner domain rule로 단정하지 말고 dedicated domain rule 필요성을 남긴다.

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

- [ ] `agent-ops/rules/project/domain/framework/rules.md`
- [ ] 필요 시 `agent-ops/rules/project/rules.md`의 dedicated domain 미정 문구와 충돌하지 않는지 확인

#### 테스트 작성

문서 경계 정리이므로 unit test는 작성하지 않는다.

#### 중간 검증

```bash
rg --sort path -n 'pubspec.yaml|analysis_options.yaml|go.mod|proto/' agent-ops/rules/project/domain/framework/rules.md agent-ops/rules/project/rules.md
```

예상: framework rule과 project rule의 package/toolchain 경계가 같은 의미를 가진다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `agent-ops/rules/project/domain/agent/rules.md` | RULES-1 |
| `agent-ops/rules/project/domain/cli/rules.md` | RULES-1 |
| `agent-ops/rules/project/domain/command/rules.md` | RULES-1 |
| `agent-ops/rules/project/domain/core/rules.md` | RULES-1 |
| `agent-ops/rules/project/domain/pipeline/rules.md` | RULES-1 |
| `agent-ops/rules/project/domain/sample/rules.md` | RULES-1 |
| `agent-ops/rules/project/domain/scheduler/rules.md` | RULES-1 |
| `agent-ops/rules/project/domain/framework/rules.md` | RULES-2 |
| `agent-ops/rules/project/rules.md` | RULES-2 |

## 최종 검증

```bash
rg --sort path -n 'lib/|bin/main|assets/' agent-ops/rules/project/domain
git diff --check
```

남은 root 경로는 의도된 legacy/external exception이어야 하고, `git diff --check`는 출력 없이 성공해야 한다.

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