# Milestone: OTO Bootstrap Command 발급

## 위치

- Roadmap: `agent-roadmap/ROADMAP.md`
- Phase: `agent-roadmap/phase/automation-runtime-bridge/PHASE.md`

## 목표

`iop-edge`가 OTO agent record를 생성하고 대상 Linux host에서 바로 실행할 one-line bootstrap command를 발급한다.
Edge는 OTO bootstrap script를 구현하지 않고, OTO가 소유한 script 인자와 release asset 계약을 소비하는 command를 만든다.

## 상태

[완료]

## 구현 잠금

- 상태: 해제
- 결정 필요: 없음

## 범위

- `iop-edge` CLI에 OTO agent registration 또는 agent bootstrap command 발급 표면을 추가한다.
- Edge config에 OTO agent id, alias, enrollment token, release base URL, bootstrap script URL을 기록하거나 재생성 가능한 구조를 둔다.
- OTO agent config와 bootstrap command는 기존 `iop-node` config/bootstrap 인터페이스를 기본형으로 유지하고, OTO 전용 script/release 인자와 `agent_kind` 차이만 명시적으로 추가한다.
- 출력 command는 OTO Linux MVP bootstrap 인자와 일치해야 한다.
- local/dev HTTP bootstrap은 명시 flag가 있을 때만 허용하고, 기본 출력은 HTTPS URL을 우선한다.

## 기능

### Epic: [command-surface] Edge CLI Command Surface

Edge-local field UX에서 OTO agent를 생성하고 bootstrap command를 출력한다.

- [x] [agent-register-cmd] `iop-edge`가 OTO agent record를 만들거나 갱신하는 command 표면을 제공한다.
- [x] [node-interface-parity] OTO agent command/config 표면이 기존 `iop-node` bootstrap의 필드명, flag 의미, 출력 형식, 진단 흐름을 최대한 유지한다.
- [x] [bootstrap-output] command 출력은 한 줄 bootstrap command만 안정적으로 제공하고 token을 불필요하게 재출력하지 않는다.
- [x] [oto-args] 출력 command가 OTO bootstrap 필수 인자 `--edge-url`, `--agent-id`, `--enrollment-token`, `--release-base-url`을 포함한다.
- [x] [config-roundtrip] 생성된 edge config를 `config check`와 runtime load가 읽을 수 있다. 검증: `go test ./apps/edge/cmd/edge ./packages/go/config`

## 완료 리뷰

- 상태: 승인됨
- 요청일: 2026-06-03
- 완료 근거:
  - `iop-edge agent register`가 OTO agent record를 upsert하고 `agent_kind: oto-agent`, alias, token, OTO bootstrap URL, release URL을 edge config에 반영한다.
  - 출력 command는 OTO bootstrap 필수 인자를 포함한 한 줄 command로 검증되며, 기본 HTTPS 우선과 명시적 local HTTP 허용 flag가 분리되어 있다.
  - 검증 명령 `go test -count=1 ./apps/edge/cmd/edge ./packages/go/config` 통과, 임시 config CLI smoke의 `config init -> agent register -> config check` 통과.
- 리뷰 필요:
  - [x] 사용자가 완료 결과를 확인했다
  - [x] archive 이동을 승인했다
- 리뷰 코멘트: 2026-06-03 사용자 요청으로 모든 기능 Task 완료 상태를 확인하고 Milestone을 완료/archive 처리한다.

## 범위 제외

- OTO bootstrap script 자체 구현
- OTO release asset 빌드/업로드 자동화
- checksum/signature 강제 검증
- Control Plane 원격 발급 UI

## 작업 컨텍스트

- 관련 경로: `apps/edge/cmd/edge/main.go`, `packages/go/config`, `configs/edge.yaml`, `../oto/assets/script/shell/oto_agent_bootstrap.sh`
- 표준선(선택): OTO bootstrap/register UX는 기존 `iop-node` bootstrap UX와 같은 인터페이스 형태를 우선하며, OTO 전용 값은 `agent_kind`, bootstrap script URL, release asset URL처럼 필요한 차이로 제한한다.
- 표준선(선택): command 형식은 `curl -fsSL "${OTO_BOOTSTRAP_URL}" | bash -s -- --edge-url "${EDGE_URL}" --agent-id "${AGENT_ID}" --enrollment-token "${ENROLLMENT_TOKEN}" --release-base-url "${OTO_RELEASE_BASE_URL}" --agent-alias "${AGENT_ALIAS}"`를 기준으로 한다.
- 표준선(선택): MVP에서는 one-time enrollment token을 사용하고 장기 credential 재발급은 후속으로 둔다.
- 선행 작업: OTO Agent Registry 구현
- 후속 작업: OTO Registration Online Smoke
- 확인 결과: local smoke용 OTO bootstrap script URL과 release base URL은 기본값을 두지 않고, command flag 또는 `bootstrap.*` config로 명시 입력한다.
