<!-- task=flutter_first_client_consolidation/01_react_retire plan=0 tag=REFACTOR -->

# React Scaffold Retirement Plan

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

`CODE_REVIEW-cloud-G06.md`의 구현 에이전트 소유 섹션을 채우는 것이 필수입니다. 구현 후 검증 명령을 실행하고 실제 출력, 계획 대비 변경 사항, 주요 설계 결정을 기록한 뒤 active 파일을 그대로 두고 리뷰 준비 상태로 보고하세요. `complete.log` 작성과 archive 이동은 code-review-skill 전용입니다.

## 배경

Flutter-first 전환으로 `apps/web` React/Vite scaffold는 더 이상 제품 UI 기준 구현이 아니다. root `bin/*`와 README/rules는 이미 Flutter-first 기준으로 바뀌었지만, React source와 web domain routing은 아직 repo에 남아 있다. 이 작업은 React scaffold를 제품 경로에서 실제로 제거하거나 명확히 격리한다.

## 분석 결과

### 읽은 파일

- `agent-ops/roadmap/current.md`
- `agent-ops/roadmap/milestones/flutter-first-client-consolidation.md`
- `README.md`
- `docs/monorepo.md`
- `bin/dev`
- `bin/test`
- `bin/lint`
- `bin/build`
- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/project/domain/web/rules.md`
- `agent-ops/rules/project/domain/mobile/rules.md`
- `agent-ops/rules/project/domain/core/rules.md`
- `agent-ops/rules/project/domain/contracts/rules.md`
- `apps/web/README.md`
- `apps/web/package.json`
- `apps/web/vite.config.ts`
- `apps/web/tsconfig.json`
- `apps/web/index.html`
- `apps/web/.env.example`
- `apps/web/.gitignore`
- all `apps/web/src/**/*.ts`, `apps/web/src/**/*.tsx`, `apps/web/src/**/*.css`

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

- React scaffold 제거: 기존 automated test는 없다. 검증은 path/search/build entrypoint로 한다.
- root helper가 web을 더 이상 호출하지 않는 동작: `bash -n`과 `bin/dev` 출력으로 확인한다.

### 심볼 참조

- 제거 대상 symbol은 React app 전체다.
- repo 문서/규칙 참조는 `rg --sort path "apps/web|React/Vite|nomadcode-web|VITE_NOMADCODE_API_BASE_URL"`로 찾는다.

### 분할 판단

split decision policy를 먼저 평가했다. 이 task group은 세 subtask로 나뉜다.
- `01_react_retire`: React scaffold 제거 또는 격리. 독립 실행 가능.
- `02_contract_boundary`: Flutter 앱과 core API 계약 후보. 독립 실행 가능.
- `03+02_app_workspace_surface`: Flutter workspace surface 구현. `02_contract_boundary` 완료 후 시작.

### 범위 결정 근거

이 작업은 `apps/web`와 web domain routing 정리에 한정한다. Flutter UI 구현, code-server launch 동작, contracts 문서화는 sibling task에서 다룬다. `agent-task/archive/**`는 읽거나 수정하지 않는다.

### 빌드 등급

build lane: `cloud-G06`, review lane: `cloud-G06`. 삭제/격리 범위가 넓고 문서/규칙/router 영향이 있어 review가 필요한 refactor다.

## 구현 체크리스트

- [ ] React scaffold 처리 방식을 삭제 또는 명확한 legacy 격리 중 하나로 적용한다.
- [ ] `agent-ops/rules/project/rules.md`와 domain rules에서 제거 후 경로/책임 설명이 충돌하지 않게 정리한다.
- [ ] `README.md`, `docs/monorepo.md`, root `bin/*`가 React web 실행/검증을 제품 경로로 안내하지 않는지 확인한다.
- [ ] 중간 검증과 최종 검증을 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REFACTOR-1] React Scaffold 처리

문제: `apps/web/package.json:1-32`는 `react`, `vite`, TanStack, Zustand 의존성을 가진 별도 제품 UI를 유지한다. `apps/web/README.md:1-49`도 web scaffold를 다음 작업 대상으로 설명한다.

해결 방법: 우선순위는 directory 삭제다. `apps/web` 전체와 `agent-ops/rules/project/domain/web/rules.md`를 제거하고, `agent-ops/rules/project/rules.md`의 `apps/web/**` domain mapping도 삭제한다. 만약 삭제 대신 격리가 필요하면 `apps/web/README.md` 맨 위에 legacy-only banner를 추가하고 root/domain mapping에서 제품 경로가 아님을 더 명확히 한다.

수정 파일 및 체크리스트:
- [ ] `apps/web/**` 삭제 또는 legacy-only 격리
- [ ] `agent-ops/rules/project/rules.md`
- [ ] `agent-ops/rules/project/domain/web/rules.md`

테스트 작성: skip. 삭제/격리 작업은 automated behavior가 아니라 repository structure 정리다.

중간 검증:

```bash
test ! -e apps/web || sed -n '1,40p' apps/web/README.md
```

예상 결과: 삭제했으면 출력 없음, 격리했으면 legacy-only banner가 40줄 안에 보인다.

### [REFACTOR-2] 문서와 helper 잔여 참조 확인

문제: React web은 이미 root helper에서 제외됐지만 잔여 문서 참조가 다시 제품 경로로 읽히면 후속 작업이 흔들린다.

해결 방법: `README.md`, `docs/monorepo.md`, `bin/dev`, `bin/test`, `bin/lint`, `bin/build`, `agent-ops/rules/project/**`, `agent-ops/roadmap/**`에서 React web이 제품 UI 기준 구현으로 안내되지 않게 한다. React web을 언급해야 한다면 "legacy/retire/remove" 맥락으로만 남긴다.

수정 파일 및 체크리스트:
- [ ] `README.md`
- [ ] `docs/monorepo.md`
- [ ] `bin/dev`
- [ ] `bin/test`
- [ ] `bin/lint`
- [ ] `bin/build`
- [ ] `agent-ops/rules/project/**`
- [ ] `agent-ops/roadmap/milestones/flutter-first-client-consolidation.md`

테스트 작성: skip. 문서/스크립트 정리이며 shell syntax와 deterministic search로 검증한다.

중간 검증:

```bash
bash -n bin/dev bin/test bin/lint bin/build
bin/dev
rg --sort path -n "web dev server|web type check|web verify|VITE_NOMADCODE_API_BASE_URL|nomadcode-web" README.md docs bin agent-ops/rules/project agent-ops/roadmap || true
```

예상 결과: shell syntax 통과, `bin/dev`가 core/app만 출력, 검색 결과가 없거나 legacy/remove 맥락뿐이다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/web/**` | REFACTOR-1 |
| `agent-ops/rules/project/rules.md` | REFACTOR-1, REFACTOR-2 |
| `agent-ops/rules/project/domain/web/rules.md` | REFACTOR-1 |
| `README.md` | REFACTOR-2 |
| `docs/monorepo.md` | REFACTOR-2 |
| `bin/dev`, `bin/test`, `bin/lint`, `bin/build` | REFACTOR-2 |
| `agent-ops/roadmap/milestones/flutter-first-client-consolidation.md` | REFACTOR-2 |

## 최종 검증

```bash
bash -n bin/dev bin/test bin/lint bin/build
bin/dev
rg --sort path -n "web dev server|web type check|web verify|VITE_NOMADCODE_API_BASE_URL|nomadcode-web" README.md docs bin agent-ops/rules/project agent-ops/roadmap || true
bin/test
bin/lint
```

예상 결과: shell syntax 통과, `bin/dev`는 core/app만 출력, 검색 결과는 없거나 legacy/remove 맥락뿐이고, `bin/test`/`bin/lint`는 설치된 toolchain 기준으로 통과 또는 명시적 skip만 출력한다.

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