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

# Implementation Plan - 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_local_G07_1.log`의 Required 이슈만 다룬다. G07 구현은 `/api/v1/` router helper를 route boundary로 옮기는 요구는 충족했지만, health/runner/job/execution handler와 JSON/proto helper까지 모두 `routes.go`로 이동했다. 이는 handler body/DTO helper 이동을 제외한 G07 계획과 split sibling 작업 경계를 위반한다. 이번 작업은 endpoint behavior를 유지하면서 파일 책임만 회복한다.

## 사용자 리뷰 요청 흐름

구현 중 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_local_G07_1.log`
- Archived review: `agent-task/m-core-server-boundary-cleanup/01_routes/code_review_local_G07_1.log`
- Verdict: `FAIL`
- Required issue: `routes.go`가 route/subrouter 파일을 넘어 1,283줄짜리 handler/DTO helper 파일이 되었고, `server.go`에는 handler 구현이 남지 않았다.

### 범위 결정 근거

- 포함: 파일 책임 회복. `routes.go`에는 route 등록과 `/api/v1/` subrouter 구성만 남기고, 기존 handler 구현과 JSON/proto helper는 `server.go`로 되돌린다.
- 제외: endpoint path/method 변경, handler body 수정, DTO helper 구조 변경, 별도 handler/DTO 파일 생성, store/domain 동작 변경.
- 이번 후속은 두 번째 FAIL을 닫는 범위 회복 작업이며 source 이동량은 크지만 기계적이고 검증 가능하므로 `local-G08`로 라우팅한다.

## 구현 체크리스트

- [ ] `services/core/internal/httpserver/routes.go`에는 `registerRoutes`, `apiPathSegments`, `handleRouter`와 route/subrouter 구성에 직접 필요한 import만 남긴다.
- [ ] `handleHealthz`, runner/job/execution handlers, `writeResponse`, JSON/proto conversion helpers, validation helpers를 `services/core/internal/httpserver/server.go`로 되돌린다.
- [ ] `server.go`는 server 생성/lifecycle과 handler 구현을 함께 보유하고, `routes.go`는 handler body나 DTO helper를 보유하지 않도록 import와 함수 배치를 정리한다.
- [ ] 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_ROUTES-1] Restore Handler Ownership

#### 문제

- `services/core/internal/httpserver/routes.go`가 route registration/subrouter helper뿐 아니라 handler 구현과 JSON/proto helper까지 소유한다.
- `services/core/internal/httpserver/server.go`에는 handler 구현이 남지 않아 G07 계획의 제외 범위를 위반하고 후속 `02+01_dto`, `03+01,02_handlers` split 작업 경계를 흐린다.

#### 해결 방법

- `routes.go`에서 다음만 유지한다.
  - `registerRoutes`
  - `apiPathSegments`
  - `handleRouter`
- 그 외 handler, response writer, JSON/proto conversion, validation/helper functions는 `server.go`로 되돌린다.
- 같은 package 내부 함수 호출은 그대로 유지한다. 함수 이름과 signature를 바꾸지 않는다.
- `server.go`와 `routes.go` import를 `gofmt` 기준으로 정리한다.

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

- [ ] `services/core/internal/httpserver/routes.go` 수정.
- [ ] `services/core/internal/httpserver/server.go` 수정.
- [ ] `services/core/internal/httpserver/server_test.go`는 기존 tests 유지. 테스트 수정이 필요하다면 behavior 변경이 아닌 symbol 위치 회귀 때문에 필요한지 먼저 재검토한다.

#### 테스트 작성

- 신규 테스트 작성은 필수 아님. 기존 `TestServerMux`와 `/api/v1/` `handleRouter` direct-call tests가 route/subrouter behavior 회귀를 덮는다.

#### 중간 검증

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

기대 결과: `ok github.com/toki/oto/services/core/internal/httpserver`.

## 수정 파일 요약

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

## 최종 검증

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

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

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