diff --git a/agent-roadmap/phase/automation-runtime-bridge/PHASE.md b/agent-roadmap/phase/automation-runtime-bridge/PHASE.md index cf0e391..d710544 100644 --- a/agent-roadmap/phase/automation-runtime-bridge/PHASE.md +++ b/agent-roadmap/phase/automation-runtime-bridge/PHASE.md @@ -46,6 +46,10 @@ CLI 실행, specialized agent 등록, bootstrap/enrollment, 원격 터미널 브 - 경로: `agent-roadmap/archive/phase/automation-runtime-bridge/milestones/oto-agent-message-boundary.md` - 요약: OTO 독립형 실행 전환으로 Edge 직접 OTO domain payload boundary 정리가 현재 범위에서 필요 없어져 폐기한다. +- [검토중] IOP OTO 전용 경로 제거 + - 경로: `agent-roadmap/phase/automation-runtime-bridge/milestones/oto-specific-iop-removal.md` + - 요약: OTO 독립 Control Plane 전환에 맞춰 IOP 활성 코드와 문서에서 OTO 전용 agent kind, bootstrap, smoke, 운영 문구를 제거했고 사용자 완료 확인과 archive 승인을 기다린다. + - [계획] 원격 터미널 브리지 POC - 경로: `agent-roadmap/phase/automation-runtime-bridge/milestones/remote-terminal-bridge-poc.md` - 요약: Agent를 설치하기 어려운 host/device를 위해 Edge broker와 Node terminal transport 기반 원격 터미널 브리지 POC를 만든다. diff --git a/agent-roadmap/phase/automation-runtime-bridge/milestones/oto-specific-iop-removal.md b/agent-roadmap/phase/automation-runtime-bridge/milestones/oto-specific-iop-removal.md index 5a85c42..c80bf6c 100644 --- a/agent-roadmap/phase/automation-runtime-bridge/milestones/oto-specific-iop-removal.md +++ b/agent-roadmap/phase/automation-runtime-bridge/milestones/oto-specific-iop-removal.md @@ -12,7 +12,7 @@ IOP에는 OTO 전용 agent kind, bootstrap config, smoke target, test fixture, ## 상태 -[진행중] +[검토중] ## 구현 잠금 @@ -30,22 +30,23 @@ IOP에는 OTO 전용 agent kind, bootstrap config, smoke target, test fixture, ### Epic: [decommission] OTO-Specific IOP Decommission -- [ ] [inventory] 활성 파일 기준으로 OTO 전용 잔여 지점을 목록화하고 archive 스냅샷과 무관한 제거 대상을 확정한다. -- [ ] [config-cleanup] `packages/go/config`, `configs/edge.yaml`, Edge command에서 OTO 전용 agent kind와 bootstrap/release config를 제거한다. -- [ ] [runtime-cleanup] Edge registry, transport, service snapshot, Control Plane/Client fixture에서 OTO 전용 조건 분기와 표시 문구를 제거하거나 generic 표현으로 바꾼다. -- [ ] [smoke-cleanup] `Makefile`의 OTO registration smoke와 OTO repository 의존 실행 경로를 제거한다. -- [ ] [docs-cleanup] README, agent-ops project rules, 활성 로드맵 문서에서 OTO를 IOP-managed specialized agent로 설명하는 최신 문구를 제거하고 독립 경계로 정리한다. -- [ ] [verification] active code/docs 검색과 변경 영향 테스트로 OTO 전용 경로 제거를 검증한다. 검증: `rg -n --hidden -S "\bOTO\b|\boto\b|oto-agent|OTOAgent|OTOBootstrap|oto_bootstrap|oto_release" -g '!agent-roadmap/archive/**' -g '!agent-task/archive/**' -g '!.git/**' -g '!build/**'` 결과가 archive/역사 보존 외 제거 대상 없음으로 정리되고, 변경 범위에 맞는 Go/Flutter 테스트가 통과한다. +- [x] [inventory] 활성 파일 기준으로 OTO 전용 잔여 지점을 목록화하고 archive 스냅샷과 무관한 제거 대상을 확정한다. +- [x] [config-cleanup] `packages/go/config`, `configs/edge.yaml`, Edge command에서 OTO 전용 agent kind와 bootstrap/release config를 제거한다. +- [x] [runtime-cleanup] Edge registry, transport, service snapshot, Control Plane/Client fixture에서 OTO 전용 조건 분기와 표시 문구를 제거하거나 generic 표현으로 바꾼다. +- [x] [smoke-cleanup] `Makefile`의 OTO registration smoke와 OTO repository 의존 실행 경로를 제거한다. +- [x] [docs-cleanup] README, agent-ops project rules, 활성 로드맵 문서에서 OTO를 IOP-managed specialized agent로 설명하는 최신 문구를 제거하고 독립 경계로 정리한다. +- [x] [verification] active code/docs 검색과 변경 영향 테스트로 OTO 전용 경로 제거를 검증한다. 검증: `rg -n --hidden -S "\bOTO\b|\boto\b|oto-agent|OTOAgent|OTOBootstrap|oto_bootstrap|oto_release" -g '!agent-roadmap/archive/**' -g '!agent-task/archive/**' -g '!.git/**' -g '!build/**'` 결과가 archive/역사 보존 외 제거 대상 없음으로 정리되고, 변경 범위에 맞는 Go/Flutter 테스트가 통과한다. ## 완료 리뷰 -- 상태: 없음 -- 요청일: 없음 -- 완료 근거: 모든 기능 Task와 Task 안에 명시된 검증이 아직 충족되지 않았다. +- 상태: 요청됨 +- 요청일: 2026-06-06 +- 완료 근거: `packages/go/config/config_test.go`의 OTO 전용 negative fixture와 `apps/edge/cmd/edge/main_test.go`의 legacy help unwanted list를 정리했고, 비-roadmap 활성 코드/문서 검색에서 OTO 전용 잔여가 없음을 확인했다. +- 완료 근거: `go test ./packages/go/config`, `go test ./apps/edge/cmd/edge`, `go test ./packages/go/... ./apps/edge/...`가 통과했다. Flutter 변경은 없어 Flutter 테스트는 범위 밖으로 보았다. - 리뷰 필요: - [ ] 사용자가 완료 결과를 확인했다 - [ ] archive 이동을 승인했다 -- 리뷰 코멘트: 없음 +- 리뷰 코멘트: 작은 잔여 작업은 즉시 처리했고, 별도 plan이 필요한 큰 작업은 발견되지 않았다. ## 범위 제외 @@ -59,3 +60,5 @@ IOP에는 OTO 전용 agent kind, bootstrap config, smoke target, test fixture, - 표준선: IOP는 OTO를 직접 등록/부트스트랩/상태 관리하는 책임을 갖지 않는다. 필요한 generic 확장 지점은 OTO 이름 없이 external/domain agent 또는 adapter-neutral 표현으로 남긴다. - 선행 작업: OTO 독립형 실행 전환 결정, Edge 직접 OTO registration 관련 Milestone 폐기 - 후속 작업: 제거 후 필요하면 generic external agent 경계를 별도 Milestone으로 재정의한다. +- 현재 동기화 상태: 작은 잔여 작업은 직접 처리했다. 비-archive `agent-task`에는 별도 plan이 필요한 `m-oto-specific-iop-removal` 작업 산출물이 없다. +- 현재 inventory: 비-roadmap 활성 코드/문서에서는 OTO 전용 문자열 검색 결과가 없다. 활성 Phase/Milestone의 OTO 언급은 과거 링크 또는 현재 제거 작업 문맥으로 본다. diff --git a/apps/edge/cmd/edge/main_test.go b/apps/edge/cmd/edge/main_test.go index cebe668..47bb442 100644 --- a/apps/edge/cmd/edge/main_test.go +++ b/apps/edge/cmd/edge/main_test.go @@ -1114,7 +1114,7 @@ func TestHelpDiscoversEdgeLocalDevFlow(t *testing.T) { } // 2. Assert absence of non-official/legacy paths (verify they aren't recommended) - for _, unwanted := range []string{"scripts/dev/edge.sh", "scripts/dev/node.sh", "dev-deploy", "agent register", "oto-agent"} { + for _, unwanted := range []string{"scripts/dev/edge.sh", "scripts/dev/node.sh", "dev-deploy", "agent register"} { if strings.Contains(got, unwanted) { t.Errorf("root help contains legacy path reference: %q", unwanted) } diff --git a/packages/go/config/config_test.go b/packages/go/config/config_test.go index 16bd7d3..c445185 100644 --- a/packages/go/config/config_test.go +++ b/packages/go/config/config_test.go @@ -722,29 +722,6 @@ logging: } } -func TestLoadEdge_NodeAgentKindRejectsOTO(t *testing.T) { - dir := t.TempDir() - f := filepath.Join(dir, "edge.yaml") - yaml := ` -server: - listen: "0.0.0.0:9090" -nodes: - - alias: "agent-local" - token: "token-agent" - agent_kind: "oto-agent" -` - if err := os.WriteFile(f, []byte(yaml), 0o600); err != nil { - t.Fatalf("write yaml: %v", err) - } - _, err := config.LoadEdge(f) - if err == nil { - t.Fatal("expected invalid agent_kind error") - } - if !strings.Contains(err.Error(), "agent_kind") { - t.Fatalf("expected error to mention agent_kind, got %v", err) - } -} - func TestLoadEdge_A2ADefaults(t *testing.T) { dir := t.TempDir() f := filepath.Join(dir, "edge.yaml")