<!-- task=m-client-integration-standardization/01_client_module_boundary plan=0 tag=CIS-PATH -->

# Code Review Reference - CIS-PATH

> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> The task is NOT complete until every implementation-owned section below is filled in.
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
> Follow the ownership table at the bottom of this file for which sections you own.

## 개요

date=2026-05-25
task=m-client-integration-standardization/01_client_module_boundary, plan=0, tag=CIS-PATH

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

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.

1. 판정을 append한다.
2. `CODE_REVIEW-cloud-G07.md` → `code_review_cloud_G07_N.log`, `PLAN-cloud-G07.md` → `plan_cloud_G07_M.log`로 아카이브한다.
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-client-integration-standardization/01_client_module_boundary/`로 이동한다. WARN/FAIL이면 다음 active plan/review 파일을 즉시 작성한다.
4. PASS이고 task group이 `m-<milestone-slug>`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [CIS-PATH-1] Flutter host 경로를 `apps/client`로 이동 | [x] |
| [CIS-PATH-2] root helper와 workspace 문서 갱신 | [x] |
| [CIS-PATH-3] project/domain rules 갱신 | [x] |

## 구현 체크리스트

- [x] [CIS-PATH-1] `apps/mobile` Flutter host를 `apps/client`로 이동하고 package/app 표시 이름은 유지한다.
- [x] [CIS-PATH-2] root helper와 workspace 문서를 `apps/client` 기준으로 갱신한다.
- [x] [CIS-PATH-3] project/domain rules의 client 경로 매핑을 갱신한다.
- [x] 중간 검증과 최종 검증 명령을 실행하고 실제 출력을 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 코드리뷰 전용 체크리스트

> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G07_N.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_cloud_G07_M.log`로 아카이브한다.
- [x] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [x] PASS이면 active task 디렉터리 `agent-task/m-client-integration-standardization/01_client_module_boundary/`를 `agent-task/archive/YYYY/MM/m-client-integration-standardization/01_client_module_boundary/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [x] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [x] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-client-integration-standardization/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [ ] WARN/FAIL이면 다음 active `PLAN-cloud-G07.md`와 `CODE_REVIEW-cloud-G07.md`를 작성하고 `complete.log`를 작성하지 않는다.

## 계획 대비 변경 사항

- CIS-PATH-2 수정 파일에 `apps/client/README.md`와 `apps/client/push-notification-todo.md`를 추가했다. 두 파일에 남아 있던 호스트 앱 경로 표기(`apps/mobile`, `apps/mobile/android`, `apps/mobile/android/app/`)가 CIS-PATH-3 검증 명령 `! rg "apps/mobile" ... apps/client`의 대상 안에 포함되어 있어, 그대로 두면 최종 검증이 실패한다. 분석 결과의 "`apps/mobile` 경로 참조는 모두 `apps/client` 또는 일반 `client` 표기로 바꾼다" 원칙과도 일치한다.
- `packages/contracts/README.md`는 `apps/mobile` 참조가 없어 수정하지 않았다(PLAN의 "링크 변화가 필요할 때만 수정" 조건에 해당).
- `README.md`의 mobile 테스트 행은 helper 갱신과 어조를 맞추기 위해 "mobile 테스트" 라벨을 "client 테스트"로 함께 정리했다. 명령 자체는 PLAN대로 `cd apps/client && flutter test`로 갱신했다.
- `docs/monorepo.md`, `agent-ops/rules/project/rules.md`, `agent-ops/rules/project/domain/mobile/rules.md`의 host 설명 문구에서 "모바일/데스크톱/선택적 web target"을 유지하거나 명시해, `apps/client`가 mobile/desktop/web 표면을 모두 담당한다는 milestone 표준선을 문장 수준에서도 반영했다.

## 주요 설계 결정

- `git mv apps/mobile apps/client`로 디렉터리 전체를 한 번에 이동했다. tracked 163개 파일과 ignored 산출물(`build/`, `.dart_tool/`, `.flutter-plugins-dependencies` 등) 모두 새 경로로 옮겨져 `test ! -e apps/mobile` 검증을 통과한다.
- Dart package name(`nomadcode_app`), Android `namespace`/`applicationId`(`com.tokilabs.mattermost`), `AndroidManifest.xml` `android:label`(`nomadcode-app`)은 모두 그대로 유지했다. milestone 표준선은 host 경로만 `apps/client`로 통일하고 제품 정체성은 보존하는 것이다.
- domain 이름은 기존 `mobile`로 유지하고 포함 경로만 `apps/client/**`로 매핑했다. mobile 도메인 rule의 책임 범위 문장도 "Flutter-first 제품 UI 도메인"과 "모바일/데스크톱/선택적 web target의 기준 클라이언트"를 유지해, host가 mobile/desktop/web을 모두 담당한다는 점을 명시한다.
- root helper의 skip 메시지도 새 경로(`skip apps/client: flutter not found`)로 맞춰, 운영자 출력만 봐도 어느 host 경로가 누락됐는지 즉시 식별 가능하게 했다.
- framework 동기화 영역인 `agent-ops/rules/common/**`와 `agent-ops/skills/common/**`는 손대지 않았다. milestone 범위 밖인 `../iop`, `../alt`, `../mattermost-push-plugin`, `../proto-socket`도 그대로 두었다.

## 리뷰어를 위한 체크포인트

- `apps/mobile` 경로가 실제로 사라지고 `apps/client`가 Flutter host가 되었는지 확인한다.
- root helper가 새 경로에서 Flutter test/analyze/build를 실행하는지 확인한다.
- project/domain rules가 `apps/client` 경로와 framework common 영역 경계를 지키는지 확인한다.

## 검증 결과

_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._

필수 규칙:
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.

### CIS-PATH-1 중간 검증
```bash
$ test -f apps/client/pubspec.yaml && test ! -e apps/mobile
(exit 0, no stdout/stderr)
```

### CIS-PATH-2 중간 검증
```bash
$ bash -n bin/test bin/lint bin/build bin/dev
(exit 0, no stdout/stderr)
```

### CIS-PATH-3 중간 검증
```bash
$ bash -lc '! rg --sort path -n "apps/mobile" bin README.md docs agent-ops/rules/project packages/contracts apps/client'
(exit 0, no stdout/stderr — rg는 매칭이 없어 exit 1, 부정 `!` 적용 후 exit 0)
```

### 최종 검증
```bash
$ test -f apps/client/pubspec.yaml && test ! -e apps/mobile
(exit 0, no stdout/stderr)

$ bash -n bin/test bin/lint bin/build bin/dev
(exit 0, no stdout/stderr)

$ bash -lc '! rg --sort path -n "apps/mobile" bin README.md docs agent-ops/rules/project packages/contracts apps/client'
(exit 0, no stdout/stderr)

$ cd apps/client && flutter test
00:00 +0: loading /config/workspace/nomadcode/apps/client/test/widget_test.dart
00:00 +0: App renders console dashboard title
00:00 +1: WorkspaceHomePage triggers launcher callback on button tap
00:00 +2: All tests passed!

$ cd apps/client && flutter analyze --no-fatal-infos
Analyzing client...

   info • Don't invoke 'print' in production code • lib/main.dart:39:5 • avoid_print
   info • Don't invoke 'print' in production code • lib/main.dart:63:11 • avoid_print
   info • Don't invoke 'print' in production code • lib/main.dart:66:11 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:25:7 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:32:5 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:38:7 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:41:7 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:48:7 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:52:5 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:96:5 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:114:9 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:123:9 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:125:9 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:128:7 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:145:7 • avoid_print
   info • Don't invoke 'print' in production code • lib/services/mattermost_auth_service.dart:147:7 • avoid_print

16 issues found. (ran in 3.6s)
(exit 0 — `--no-fatal-infos`로 info만 남아 exit 0. baseline `avoid_print` 16건은 mobile 도메인 rule이 별도 cleanup으로 분리하라 명시했고, 이번 작업 범위에서 변경하지 않았다.)
```

---

> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
> If anything is blank, go back and fill it in before saving this file.
> Leave review-agent-only sections unchanged.

## 코드리뷰 결과

### 종합 판정

PASS

### 차원별 평가

| 차원 | 평가 | 근거 |
|------|------|------|
| correctness | Pass | `apps/mobile` tracked tree가 `apps/client`로 100% rename되었고, package/app 표시 이름 및 Android namespace/applicationId/label 유지가 확인됨. |
| completeness | Pass | 계획의 세 구현 항목과 구현 체크리스트가 모두 완료되었고, 문서/rules/helper 경로 변경이 계획 범위와 일치함. |
| test coverage | Pass | 계획 검증과 추가 root helper 검증이 통과함. 기존 widget test와 analyze 기준도 유지됨. |
| API contract | Pass | contracts note의 client 경로 참조만 갱신했고 schema/API shape 변경은 없음. |
| code quality | Pass | path rename 및 문서/helper 변경 외 불필요한 코드 변경, debug print 추가, dead code 추가가 없음. |
| plan deviation | Pass | 추가 수정된 `apps/client/README.md`, `apps/client/push-notification-todo.md`는 stale path 제거 범위로 설명되어 있고 타당함. |
| verification trust | Pass | 리뷰에서 `test -f apps/client/pubspec.yaml && test ! -e apps/mobile`, `bash -n`, stale path search, `flutter test`, `flutter analyze --no-fatal-infos`, `bin/test`, `bin/lint`를 재실행해 기록과 일치함을 확인함. |

### 발견된 문제

없음

### 다음 단계

PASS - `complete.log` 작성 후 task 디렉터리를 archive로 이동한다.
