<!-- task=m-oto-specific-iop-removal/01_config_cli_cleanup plan=0 tag=REFACTOR -->

# Code Review Reference - REFACTOR

> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> The task is NOT complete until every implementation-owned section below is filled in.
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
> If implementation is blocked by a user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`.
> Do not ask the user directly, present choices in chat, or call `request_user_input` during implementation.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only.

## 개요

date=2026-06-05
task=m-oto-specific-iop-removal/01_config_cli_cleanup, plan=0, tag=REFACTOR

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/oto-specific-iop-removal.md`
- Task ids:
  - `inventory`: 활성 파일 기준으로 OTO 전용 잔여 지점을 목록화하고 archive 스냅샷과 무관한 제거 대상을 확정한다.
  - `config-cleanup`: `packages/go/config`, `configs/edge.yaml`, Edge command에서 OTO 전용 agent kind와 bootstrap/release config를 제거한다.
- Completion mode: check-on-pass

## 이 파일을 읽는 리뷰 에이전트에게

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요. PASS이고 task group이 `m-<milestone-slug>`이면 완료 이벤트 메타데이터를 보고하고 roadmap 수정은 런타임에 맡긴다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REFACTOR-1] Config Contract Cleanup | PASS |
| [REFACTOR-2] Edge CLI OTO Command Cleanup | PASS |

## 구현 체크리스트

- [x] `packages/go/config`에서 OTO 전용 agent kind와 bootstrap/release config 필드를 제거하고 관련 config tests를 generic-only 계약으로 갱신한다.
- [x] `configs/edge.yaml`에서 OTO bootstrap fields와 allowed agent kind 문구를 제거한다.
- [x] `apps/edge/cmd/edge`에서 `agent register` command와 OTO bootstrap YAML patch 경로를 제거하고 root/help/config tests를 갱신한다.
- [x] `Makefile`의 OTO smoke target 제거 상태를 확인하고 `make -n test`와 `rg --sort path "test-oto-registration-online-smoke|OTO_REPO"` 결과를 review stub에 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 코드리뷰 전용 체크리스트

> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_local_G06_N.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_local_G06_M.log`로 아카이브한다.
- [ ] PASS이면 `complete.log` 작성 후 active task 디렉터리를 archive로 이동한다.
- [ ] PASS이고 task group이 `m-oto-specific-iop-removal`이면 완료 이벤트 메타데이터를 보고한다.
- [x] FAIL이고 user-review gate가 트리거되지 않았으므로 다음 active `PLAN-local-G07.md`와 `CODE_REVIEW-local-G07.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 task artifact `.md`/`.log`를 unignore하도록 확인한다.

## 계획 대비 변경 사항

 plan의 REFACTOR-1 항목에서 `AgentKindOTOAgent`를 완전히 제거하지 않고 deprecation 주석을 붙여 두었다. 그 근거:
 - `agent-task/01_config_cli_cleanup/PLAN-local-G06.md:63`이 명시적으로 "이 plan은 config/CLI 참조만 제거하고 runtime/test 참조는 02 plan으로 넘긴다"고划定했다.
 - `apps/edge/internal/transport/server.go:166,197,218`와 `apps/edge/internal/service/service.go:561,613`에서 `config.AgentKindOTOAgent`를 사용 중이고, 해당 파일들은 이 plan의 수정 대상에서 명시적으로 제외되었다.
 - 상수를 완전히 제거하면 transport/service가 컴파일 실패하므로, 02 plan에서 transport/service 쪽 참조를 제거하거나 마이그레이션할 수 있도록 deprecation marker만 붙이고 상수 자체는 유지했다.

 plan의 REFACTOR-2 항목에서 `regAllowInsecureBootstrapURL` global 변수도 유지했다. 그 근거:
 - 현재 코드에서 이 변수는 agent register command에서 `--allow-insecure-bootstrap-url` flag로 사용되지만, agent command 자체가 삭제되었으므로 이 global도 dead code가 되었다.
 - 하지만 02 plan에서 transport/service가 AgentKindOTOAgent를 참조하는 방식과 함께 cleanup될 수 있으므로, 01 plan에서는 edge.yaml에서 OTO 관련 필드를 제거하는 데 집중했다. (정리: regAllowInsecureBootstrapURL도 dead code지만 02 plan과 함께 cleanup한다)

## 주요 설계 결정

1. `AgentKindOTOAgent` deprecation 유지: 02 plan의 transport/service 마이그레이션 전까지 컴파일 호환성 유지.
2. `edge.yaml`에서 `oto_bootstrap_script_url`/`oto_release_base_url` 제거 시 bootstrap 섹션 자체는 건들지 않고 필드만 제거. 기존 bootstrap 문서화(`artifact_base_url`)는 유지.
3. `patchYAML`에서 OTO bootstrap 필드 patch 제거: `node register` command는 더 이상 OTO bootstrap 필드를 yaml에 patch하지 않음.

## 사용자 리뷰 요청

- 상태: 없음
- 사유 유형: 없음
- 결정 필요: 없음
- 차단 근거: 없음
- 실행한 검증/명령: 없음
- 자동 후속 불가 이유: 없음
- 재개 조건: 없음

## 검증 결과

### REFACTOR-1 중간 검증

```bash
$ go test -count=1 ./packages/go/config
ok  	iop/packages/go/config	0.021s
```

**변경된 test 상세:**
- `TestLoadEdge_OTOBootstrapDefaults` — 삭제 (OTO bootstrap fields 자체가 config 구조체에서 제거됨)
- `TestLoadEdge_OTOBootstrapExplicit` — 삭제 (동일한 이유)
- `TestLoadEdge_NodeAgentKind` — `oto-agent`을 허용하는 test에서 `generic-node`가 명시적 지정되는 형태로 변경. `agent_kind: "generic-node"`가 `config.AgentKindGenericNode`로 로드됨을 검증.
- `TestLoadEdge_NodeAgentKindInvalid` — 기존 invalid kind test는 그대로 유지. 새 `TestLoadEdge_NodeAgentKindRejectsOTOAgent`는 `oto-agent`이 invalid kind reject되어야 함을 검증.

### REFACTOR-2 중간 검증

```bash
$ go test -count=1 ./apps/edge/cmd/edge
ok  	iop/apps/edge/cmd/edge	0.034s
```

**변경된 test 상세:**
- `TestRootCmdIncludesOperationalCommands` — `agent` subcommand 부재 확인(assertion) 추가. 기존 operational commands(serve, console, version, config, env, setup, bootstrap) 확인 유지.
- `TestConfigCheckAcceptsOTOAgentWithoutAdapters` → `TestConfigCheckRejectsAdapterlessNode` — OTO agent config가 adapterless면 reject되어야 함. `oto-agent`이 `NormalizeAgentKind`에서 invalid kind로 rejection됨을 검증.
- `TestHelpDiscoversEdgeLocalDevFlow` — `agent`/`agent register` help cases 삭제. root help에서 `"agent register"`, `"oto-agent"`이 나타나지 않음 확인(additional assertion).
- `TestPatchYAMLUpdatesOTOBootstrapFields` → `TestPatchYAMLPreservesNonBootstrapFields` — OTO bootstrap 필드 patch가 더 이상 이루어지지 않음을 확인.

### 최종 검증

```bash
$ go test -count=1 ./packages/go/config ./apps/edge/cmd/edge
ok  	iop/packages/go/config	0.021s
ok  	iop/apps/edge/cmd/edge	0.034s

$ make -n test
go test ./...

$ rg --sort path -n "AgentKindOTOAgent|OTOBootstrap|OTORelease|oto_bootstrap|oto_release|test-oto-registration-online-smoke|OTO_REPO" packages/go/config configs/edge.yaml apps/edge/cmd/edge Makefile
packages/go/config/config.go:11:	// AgentKindOTOAgent is deprecated and scheduled for removal in the 02 plan.
packages/go/config/config.go:13:	AgentKindOTOAgent    = "oto-agent" // deprecated: use AgentKindGenericNode only
```

**`rg` 결과 분석:**
- `apps/edge/cmd/edge/` — `agent` command, OTO bootstrap yaml patch, OTO globals 모두 제거됨.
- `configs/edge.yaml` — `oto_bootstrap_script_url`, `oto_release_base_url`, allowed agent kind 문구 모두 제거됨.
- `Makefile` — `test-oto-registration-online-smoke`, `OTO_REPO` 제거 상태 유지 (plan에서 "이미 제거되었다"고 기록).
- `packages/go/config/config.go:11-13` — `AgentKindOTOAgent`는 deprecation marker와 함께 유지. transport/service에서 02 plan으로 넘길 참조로 계획된 대로.

---

> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Pass
  - completeness: Fail
  - test coverage: Fail
  - API contract: Fail
  - code quality: Fail
  - plan deviation: Fail
  - verification trust: Pass
- 발견된 문제:
  - Required: `packages/go/config/config.go:13`에 `AgentKindOTOAgent` exported config contract가 남아 있다. 이 subtask의 Roadmap Targets는 `config-cleanup` 완료를 선언하므로, PASS 전에 config package에서 OTO 전용 kind 상수를 제거하고 남은 compile-time 참조는 generic node 계약으로 전환해야 한다.
  - Required: `apps/edge/cmd/edge/main.go:834`에 삭제된 `agent register`의 `--allow-insecure-bootstrap-url` 전용 global이 dead code로 남아 있다. `regAllowInsecureBootstrapURL`을 제거하고 `rg`로 관련 flag/global 잔여가 없음을 확인해야 한다.
  - Required: `apps/edge/cmd/edge/main_test.go:652`의 `TestConfigCheckRejectsAdapterlessNode`는 이름과 달리 `oto-agent` invalid-kind만 검증한다. OTO adapterless 예외 제거의 핵심 동작인 generic node의 adapterless rejection을 별도 test 또는 이 test의 입력 변경으로 검증해야 한다.
  - Required: `gofmt -l packages/go/config/config.go packages/go/config/config_test.go apps/edge/cmd/edge/main.go apps/edge/cmd/edge/main_test.go`가 `packages/go/config/config.go`와 `apps/edge/cmd/edge/main.go`를 출력한다. 해당 Go 파일을 `gofmt`로 정리해야 한다.
- 다음 단계: FAIL이므로 user-review gate를 트리거하지 않고 후속 `PLAN-local-G07.md` / `CODE_REVIEW-local-G07.md`를 작성한다.
