완료 일시: 2026-05-03

요약: Jenkins 스타일 노드 중앙 관리 구조 리팩토링 — plan×2, loop×2

루프 이력:

| plan | code_review | 판정 |
|------|-------------|------|
| plan_0.log | code_review_0.log | FAIL |
| plan_1.log | code_review_1.log | PASS |

최종 리뷰 요약:

- proto/iop/runtime.proto에 RegisterRequest, RegisterResponse, NodeConfigPayload, AdapterConfig, NodeRuntimeConfig 추가
- packages/config: NodeConfig를 transport+logging+metrics로 단순화, EdgeConfig에 Nodes []NodeDefinition 추가, TransportConf에 Token 추가
- configs/node.yaml: edge_addr+token+logging+metrics만 남김 / configs/edge.yaml: nodes 섹션 추가
- apps/edge/internal/node/store.go 신규: NodeStore(token/ID 기반 조회), LoadFromConfig(token·alias 중복 검사)
- apps/edge/internal/node/registry.go: NodeEntry에서 Adapters 제거, Alias 추가
- apps/edge/internal/transport/server.go: CapabilityRequest 핸드셰이크 → RegisterRequest/Response 핸드셰이크, buildConfigPayload(오류 반환형), stringsToAny, 중복 접속 차단
- apps/edge/internal/bootstrap/module.go: NodeStore provider 추가, OnStart에서 config 기반 시드
- apps/node/internal/transport/session.go: Handler에서 OnCapabilityRequest 제거, SetHandler(mutex) 추가
- apps/node/internal/transport/parser.go: CapabilityRequest 제거, RegisterResponse 추가
- apps/node/internal/transport/client.go: DialEdge → RegisterResult 반환형으로 전면 재작성
- apps/node/internal/node/node.go: New()에서 *config.NodeConfig → nodeID string, OnCapabilityRequest 삭제
- apps/node/internal/adapters/factory.go 신규: BuildFromPayload(proto payload → Registry 동적 초기화)
- apps/node/internal/bootstrap/module.go: OnStart 내부 순차 초기화(dial→config수신→adapter빌드→node생성→handler설정), storeDSN, OnStop에서 store.Close()
- 테스트: edge/node integration test 갱신, factory_test, store_test, server_test(CLIArgsRoundtrip) 신규

잔여 Nit: 없음
