<!-- task=m-agent-readable-repository-refactor/03_service_node_modules plan=0 tag=REFACTOR_RUNTIME -->

# Edge service와 Node runtime 책임 중심 파일 분해 계획

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

검증 실행과 `CODE_REVIEW-*-G??.md` 구현 소유 섹션 작성이 필수다. active 파일을 유지하고 리뷰 준비 완료를 보고한다. Milestone `결정 필요`만 review stub에 기록하며 직접 질문, `request_user_input`, `USER_REVIEW.md`, archive, `complete.log` 작성은 금지한다.

## 배경

Edge `run_dispatch.go`/`model_queue.go`와 Node `node.go`는 합계 3,560줄이다. run/provider resolution, pool/tunnel/cancel/session, queue admission/release/snapshot, Node run/tunnel/command/refresh/sink가 파일 단위로 드러나지 않는다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/agent-readable-repository-refactor.md`
- Milestone link: [Milestone 문서](agent-roadmap/phase/automation-runtime-bridge/milestones/agent-readable-repository-refactor.md)
- Task ids:
  - `service-node-modules`: Edge dispatch/queue와 Node handler/sink 책임 분해
- Completion mode: check-on-pass

## 분석 결과

- 읽은 파일: 세 대상 파일의 전체 symbol/함수 경계, Edge service/Node 테스트 목록, `agent-contract/inner/edge-node-runtime-wire.md`, `agent-contract/inner/edge-config-runtime-refresh.md`, `agent-spec/runtime/edge-node-execution.md`.
- SDD 기준: `SDD: 불필요`; proto/service interface와 runtime 의미를 보존하는 파일 분리다.
- 테스트 환경 규칙: local `edge-smoke`, `node-smoke`, `testing-smoke`; `GOCACHE=/tmp/iop-go-cache`, `-count=1`.
- 기준선: `go test -count=1 ./apps/edge/internal/service ./apps/node/internal/node` 통과.
- 분할 판단: 두 package는 독립 배포가 아니라 동일 Edge–Node run/tunnel lifecycle의 양 끝이며 한 plan에서 각 package 중간 검증 후 통합 검증한다. 내부 함수 복잡도와 다인자 context는 후속 `04+01,03_openai_complexity`가 다룬다.
- 제외: proto/API 변경, queue policy·capacity semantics, release timing, session/cancel behavior, 새 package.
- 빌드 등급: `cloud-G08`; concurrency/release와 양끝 wire 보존 검토가 필요하다.

## 구현 체크리스트

- [ ] Edge run types/submit/provider resolution/provider pool/tunnel/cancel 책임을 same-package 파일로 분리한다.
- [ ] queue admission/release/snapshot 책임을 분리하고 lock·release 순서를 보존한다.
- [ ] Node run/tunnel/command/refresh/sink 책임을 same-package 파일로 분리한다.
- [ ] Edge service·Node package 회귀와 Edge–Node full-cycle 진단, readability ratchet을 통과시킨다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REFACTOR_RUNTIME-1] Edge run/provider dispatch 파일 분리

문제: `run_dispatch.go:22-1465`가 public request/result types부터 provider routing/tunnel, cancel/session, wire builder까지 가진다.

해결 방법: `run_types.go`, `run_submit.go`, `provider_resolution.go`, `provider_pool.go`, `provider_tunnel.go`, `run_cancel.go`, `run_wire.go`로 이동한다.

- [ ] exported identifier와 method receiver/signature를 보존한다.
- [ ] tunnel subscribe/route/close와 release exactly-once 동작을 보존한다.
- 테스트 작성: skip. `run_dispatch_internal_test.go`, `queue_dispatch_test.go`, provider scheduling tests가 존재한다.
- 중간 검증: `GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/edge/internal/service -run 'SubmitRun|ProviderPool|ProviderTunnel|Cancel|Terminate'`

### [REFACTOR_RUNTIME-2] Queue admission/release/snapshot 파일 분리

문제: `model_queue.go:36-1009`가 state types, admission loop, terminal/disconnect release, scheduling, snapshot aggregation을 함께 가진다.

해결 방법: `model_queue_types.go`, `model_queue_admission.go`, `model_queue_release.go`, `model_queue_snapshot.go`로 선언을 이동한다.

- [ ] mutex 영역과 waiter/channel lifecycle을 변경하지 않는다.
- [ ] normal/long capacity, FIFO/priority/rotation, provider slot key를 유지한다.
- 테스트 작성: skip. admission/long-context/provider scheduling/status tests가 커버한다.
- 중간 검증: `GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/edge/internal/service -run 'Queue|Admission|Release|Snapshot|Long'`

### [REFACTOR_RUNTIME-3] Node handler와 sink 파일 분리

문제: `node.go:32-1086`이 Node 구성, run/tunnel, admission, cancel/refresh/command, terminal/session sink와 console print를 함께 가진다.

해결 방법: `node.go`는 struct/New만 유지하고 `run_handler.go`, `tunnel_handler.go`, `cancel_handler.go`, `config_refresh_handler.go`, `command_handler.go`, `runtime_sink.go`로 이동한다.

- [ ] background/foreground terminal synthesis와 adapter gate permit release를 보존한다.
- [ ] refresh registry swap/deferred stop와 command envelope를 보존한다.
- 테스트 작성: skip. run_cancel, provider_tunnel, gate_refresh, registry_refresh, command, sink tests가 존재한다.
- 중간 검증: `GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/internal/node`

### [REFACTOR_RUNTIME-4] 양끝 통합 검증

문제: compiler/test만으로 실제 register/message/command ordering 회귀를 모두 확인할 수 없다.

해결 방법: 전체 Edge/Node 테스트와 `e2e-smoke` `mode=bin-diagnostic`, `scope=service-node responsibility split`을 임시 config로 수행한다.

- [ ] 메시지 2회, `/nodes`, `/capabilities`, `/transport`, `/sessions`, cancel/status 관련 명시 결과를 기록한다.
- 테스트 작성: skip. 실제 entrypoint 검증이다.
- 중간 검증: `GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/edge/... ./apps/node/...`

## 최종 검증

```bash
gofmt -d apps/edge/internal/service/*.go apps/node/internal/node/*.go
GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/edge/internal/service ./apps/node/internal/node
GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/edge/... ./apps/node/...
make readability-audit
git diff --check
```

이어 `e2e-smoke` `mode=bin-diagnostic`을 실행한다. 모두 성공하고 새/증가 위반이 없어야 한다.

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