<!-- task=m-core-server-boundary-cleanup/01_routes plan=4 tag=REVIEW_REVIEW_REVIEW_REVIEW_ROUTES -->

# Implementation Plan - REVIEW_REVIEW_REVIEW_REVIEW_ROUTES

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

구현 완료의 마지막 단계는 active `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이다. 검증을 실행하고, active 파일은 그대로 둔 채 리뷰 준비 상태로 보고한다. 종결 처리, log archive, `complete.log` 작성, task directory archive 이동은 code-review 전용이다. 구현 중 사용자 결정, 사용자 소유 외부 환경, scope conflict 없이는 진행할 수 없으면 리뷰 stub의 `사용자 리뷰 요청`에 근거를 기록하고 멈춘다. 구현 중 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다.

## 배경

이 후속 계획은 `code_review_cloud_G07_3.log`의 남은 Required 이슈만 다룬다. Host validation 회복과 공백 없는 malicious Host regression test는 완료됐지만, `server.go` handler body 전반의 compacting/reordering churn이 아직 남아 있다. 이번 작업은 route extraction 결과와 Host validation fix를 유지하면서 handler body/helpers 표현을 route extraction 전 코드에 최대한 가깝게 되돌린다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. 이 섹션은 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md` 기준이다. 구현 에이전트는 직접 사용자 prompt를 만들지 않으며, code-review가 사용자 리뷰 요청의 타당성 검증과 실제 `USER_REVIEW.md` 작성을 담당한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/core-server-boundary-cleanup.md`
- Task ids:
  - `routes`: route 등록과 subrouter 구성을 handler 구현에서 분리한다.
- Completion mode: check-on-pass

## 분석 결과

### 이전 리뷰 결과

- Archived plan: `agent-task/m-core-server-boundary-cleanup/01_routes/plan_cloud_G07_3.log`
- Archived review: `agent-task/m-core-server-boundary-cleanup/01_routes/code_review_cloud_G07_3.log`
- Verdict: `FAIL`
- Required issue: Host validation은 복구됐지만 `server.go` handler body/helper 표현 churn이 route boundary task 범위를 계속 넘는다.

### 범위 결정 근거

- 포함: `server.go` handler body/helper 표현을 route extraction 전 코드에 가깝게 되돌리기, `shellEscape`를 기존 읽기 쉬운 single-quote escaping 표현으로 복원, Host validation fix와 `localhost;rm` test 유지.
- 제외: endpoint 추가/삭제, DTO helper 분리, handler 파일 분리, store/domain 동작 변경, 새 behavior change.
- 다음 리뷰는 review #5가 되므로, 다시 WARN/FAIL이면 loop-limit USER_REVIEW 게이트가 트리거된다. 이번 구현은 검증 가능한 diff 축소에 집중한다.

## 구현 체크리스트

- [ ] `services/core/internal/httpserver/routes.go`의 `registerRoutes`, `apiPathSegments`, `handleRouter` 분리는 유지한다.
- [ ] `services/core/internal/httpserver/server.go`에서 Host validation fix와 `server_test.go`의 `localhost;rm` regression test를 유지한다.
- [ ] `server.go` handler bodies/helpers의 compacted literals, 불필요한 section comments, 제거된 기존 comments, `shellEscape` 표현 변경 등 route extraction과 무관한 churn을 원래 표현에 가깝게 되돌린다.
- [ ] endpoint path 목록, `handleRouter(store, registry)` signature, HTTP method behavior를 변경하지 않고 `gofmt`를 실행한 뒤 `cd services/core && go test -count=1 ./internal/httpserver`를 통과시킨다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_REVIEW_REVIEW_ROUTES-1] Minimize Handler Body Churn

#### 문제

- `server.go`에 route boundary와 무관한 handler body reformat/rewrite가 남아 있다.
- 이 churn은 실제 route extraction diff와 보안 fix를 검토하기 어렵게 만들고, 후속 DTO/handler split 작업 경계를 흐린다.

#### 해결 방법

- `git diff` 기준으로 `server.go`에서 남아야 하는 의미 있는 변경을 다음으로 제한한다.
  - `NewServerWithRegistryAndStore`가 `registerRoutes`를 호출한다.
  - `apiPathSegments`와 `handleRouter`는 `routes.go`에 있다.
  - Host validation은 상한 포함 범위 검사로 고쳐져 있다.
- 위를 제외한 handler body/helper 표현은 route extraction 전 코드에 가깝게 복원한다.
- `shellEscape`는 기존 `return "'" + strings.ReplaceAll(s, "'", "'\\''") + "'"` 표현으로 복원한다.

#### 중간 검증

```bash
cd services/core && go test -count=1 ./internal/httpserver
```

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `services/core/internal/httpserver/server.go` | REVIEW_REVIEW_REVIEW_REVIEW_ROUTES-1 |
| `services/core/internal/httpserver/routes.go` | REVIEW_REVIEW_REVIEW_REVIEW_ROUTES-1 |
| `services/core/internal/httpserver/server_test.go` | REVIEW_REVIEW_REVIEW_REVIEW_ROUTES-1 |

## 최종 검증

```bash
cd services/core && go test -count=1 ./...
```

기대 결과: 모든 `services/core` package test 통과. Go test cache output은 허용하지 않는다.

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