From 551ab0faf2262609ccafbdd7f05b15577630400a Mon Sep 17 00:00:00 2001 From: toki Date: Wed, 3 Jun 2026 09:20:21 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20control-plane-client=20milestone?= =?UTF-8?q?=EB=A5=BC=20archive=EB=A1=9C=20=EC=9D=B4=EB=8F=99=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=EA=B4=80=EB=A0=A8=20=ED=8C=8C=EC=9D=BC=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../milestones/control-plane-client.md | 29 ++++++++++--------- agent-roadmap/current.md | 4 +-- .../phase/control-plane-portal-ops/PHASE.md | 4 +-- .../cmd/control-plane/main_test.go | 2 +- 4 files changed, 20 insertions(+), 19 deletions(-) rename agent-roadmap/{ => archive}/phase/control-plane-portal-ops/milestones/control-plane-client.md (81%) diff --git a/agent-roadmap/phase/control-plane-portal-ops/milestones/control-plane-client.md b/agent-roadmap/archive/phase/control-plane-portal-ops/milestones/control-plane-client.md similarity index 81% rename from agent-roadmap/phase/control-plane-portal-ops/milestones/control-plane-client.md rename to agent-roadmap/archive/phase/control-plane-portal-ops/milestones/control-plane-client.md index 422f463..905c929 100644 --- a/agent-roadmap/phase/control-plane-portal-ops/milestones/control-plane-client.md +++ b/agent-roadmap/archive/phase/control-plane-portal-ops/milestones/control-plane-client.md @@ -12,7 +12,7 @@ Client는 NomadCode 전용 화면이 아니라 IOP가 독립적으로 운영되 ## 상태 -[진행중] +[완료] ## 구현 잠금 @@ -38,17 +38,17 @@ Client는 NomadCode 전용 화면이 아니라 IOP가 독립적으로 운영되 ### Epic: [edge-ops-boundary] Edge Operations Boundary -- [ ] [edge-mediated] Control Plane은 Node를 직접 연결하거나 직접 스케줄링하지 않는다. -- [ ] [edge-status] Control Plane은 선행 Wire Baseline으로 연결된 하나 이상의 Edge 연결 상태를 조회할 수 있다. 검증: Edge 연결 상태 조회 경로가 동작하는지 확인한다. -- [ ] [node-registry] Control Plane은 Edge가 보고하는 Node registry와 Node 연결 상태를 운영 표면에 전달할 수 있다. 검증: Node 목록과 연결 상태가 Control Plane을 통해 조회된다. -- [ ] [edge-node-config-view] Control Plane/Client는 Edge/Node의 현재 운영 설정 요약을 조회 중심으로 보여준다. 검증: 설정 원본이나 effective config 요약이 조작 없이 표시된다. -- [ ] [edge-event-logs] Edge lifecycle event와 기본 로그/상태 이벤트 수신 흐름이 Control Plane-Edge Wire Baseline 위의 IOP Wire Protocol 기준으로 정리된다. -- [ ] [client-via-cp] Client는 Control Plane을 통해 Edge/Node 운영 lifecycle 상태를 조회한다. +- [x] [edge-mediated] Control Plane은 Node를 직접 연결하거나 직접 스케줄링하지 않는다. +- [x] [edge-status] Control Plane은 선행 Wire Baseline으로 연결된 하나 이상의 Edge 연결 상태를 조회할 수 있다. 검증: Edge 연결 상태 조회 경로가 동작하는지 확인한다. +- [x] [node-registry] Control Plane은 Edge가 보고하는 Node registry와 Node 연결 상태를 운영 표면에 전달할 수 있다. 검증: Node 목록과 연결 상태가 Control Plane을 통해 조회된다. +- [x] [edge-node-config-view] Control Plane/Client는 Edge/Node의 현재 운영 설정 요약을 조회 중심으로 보여준다. 검증: 설정 원본이나 effective config 요약이 조작 없이 표시된다. +- [x] [edge-event-logs] Edge lifecycle event와 기본 로그/상태 이벤트 수신 흐름이 Control Plane-Edge Wire Baseline 위의 IOP Wire Protocol 기준으로 정리된다. +- [x] [client-via-cp] Client는 Control Plane을 통해 Edge/Node 운영 lifecycle 상태를 조회한다. ### Epic: [client-wire-surface] Client Wire Surface - [x] [client-boundary] Flutter client는 IOP 자체 운영 UI/UX이며 NomadCode에 맞춘 전용 shell로 만들지 않는다. -- [ ] [client-status] Client는 Edge/Node 설정 요약, registry, 연결 상태, 로그/이벤트를 lifecycle 중심으로 얇게 보여줄 수 있다. 검증: Client 상태 화면 또는 상태 표시 경로를 확인한다. +- [x] [client-status] Client는 Edge/Node 설정 요약, registry, 연결 상태, 로그/이벤트를 lifecycle 중심으로 얇게 보여줄 수 있다. 검증: Client 상태 화면 또는 상태 표시 경로를 확인한다. - [x] [server-bridge] 브라우저 직접 TCP가 어려운 구간은 Control Plane server-side bridge를 둔다. - [x] [client-wire-hello] Client-Control Plane proto-socket WebSocket hello handshake scaffold가 구현되고 테스트되어 있다. 검증: Control Plane과 client 테스트에서 hello handshake가 통과한다. - [x] [http-boundary] `net/http`는 health/readiness/bootstrap 같은 보조 endpoint 용도로 유지한다. @@ -56,13 +56,14 @@ Client는 NomadCode 전용 화면이 아니라 IOP가 독립적으로 운영되 ## 완료 리뷰 -- 상태: 없음 -- 요청일: 없음 -- 완료 근거: 모든 기능 Task와 Task 안에 명시된 검증이 아직 충족되지 않았다. +- 상태: 승인됨 +- 요청일: 2026-06-03 +- 완료 근거: `m-control-plane-client/01_control_plane_status_api`와 `m-control-plane-client/02+01_client_lifecycle_ui` PASS 완료 로그가 `node-registry`, `edge-node-config-view`, `client-status`, `client-via-cp`를 완료했다. +- 완료 근거: Control Plane-Edge wire source/test 기준으로 `edge-mediated`, `edge-status`, `edge-event-logs`가 Edge-owned status request/response와 node lifecycle event relay 경계로 충족된다. - 리뷰 필요: - - [ ] 사용자가 완료 결과를 확인했다 - - [ ] archive 이동을 승인했다 -- 리뷰 코멘트: 없음 + - [x] 사용자가 완료 결과를 확인했다 + - [x] archive 이동을 승인했다 +- 리뷰 코멘트: 사용자 요청에 따라 완료 승인 후 archive 처리한다. ## 범위 제외 diff --git a/agent-roadmap/current.md b/agent-roadmap/current.md index ab75a93..c938a5d 100644 --- a/agent-roadmap/current.md +++ b/agent-roadmap/current.md @@ -7,9 +7,9 @@ ## 활성 Milestone -- [진행중] Control Plane과 Client +- [계획] 정책, 이력, 감사 - Phase: `agent-roadmap/phase/control-plane-portal-ops/PHASE.md` - - 경로: `agent-roadmap/phase/control-plane-portal-ops/milestones/control-plane-client.md` + - 경로: `agent-roadmap/phase/control-plane-portal-ops/milestones/policy-history-audit.md` ## 선택 규칙 diff --git a/agent-roadmap/phase/control-plane-portal-ops/PHASE.md b/agent-roadmap/phase/control-plane-portal-ops/PHASE.md index e5a522b..20e795d 100644 --- a/agent-roadmap/phase/control-plane-portal-ops/PHASE.md +++ b/agent-roadmap/phase/control-plane-portal-ops/PHASE.md @@ -41,8 +41,8 @@ - 경로: `agent-roadmap/archive/phase/control-plane-portal-ops/milestones/embeddable-iop-console-workbench.md` - 요약: `packages/flutter/iop_console` 패키지, left rail shell, agent panel, standalone app mount, controller/config injection, execution/logs 영역, 독립 package test/analyze 검증을 완료하고 archive했다. -- [진행중] Control Plane과 Client - - 경로: `agent-roadmap/phase/control-plane-portal-ops/milestones/control-plane-client.md` +- [완료] Control Plane과 Client + - 경로: `agent-roadmap/archive/phase/control-plane-portal-ops/milestones/control-plane-client.md` - 요약: 여러 Edge를 연결하고 관찰하며 Edge 설정 변경, 명령 전달, 이벤트 수신을 담당하는 중앙 제어면과 Flutter client 운영면을 구축한다. - [계획] 정책, 이력, 감사 diff --git a/apps/control-plane/cmd/control-plane/main_test.go b/apps/control-plane/cmd/control-plane/main_test.go index 78045a3..5a927d6 100644 --- a/apps/control-plane/cmd/control-plane/main_test.go +++ b/apps/control-plane/cmd/control-plane/main_test.go @@ -430,7 +430,7 @@ func TestEdgeRegistryHTTPHandlersGetLiveStatus(t *testing.T) { if err != nil { t.Fatalf("create dummy settings: %v", err) } - + requestStatus := func(edgeID string, timeout time.Duration) (*iop.EdgeStatusResponse, error) { if edgeID != "edge-a" { return nil, fmt.Errorf("unexpected edge: %s", edgeID)