<!-- task=m-embeddable-iop-console-workbench/01_console_api plan=2 tag=REVIEW_REVIEW_API -->

# Plan - REVIEW_REVIEW_API

## 이 파일을 읽는 구현 에이전트에게

`CODE_REVIEW-cloud-G06.md`의 구현 에이전트 소유 섹션을 채우는 것이 구현의 마지막 단계다. 구현 후 검증을 실행하고 실제 출력, 계획 대비 변경 사항, 주요 설계 결정을 기록한 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 사용자 결정, 사용자 소유 외부 환경, scope 충돌 없이는 안전하게 진행할 수 없을 때만 review stub의 `사용자 리뷰 요청`을 근거와 함께 채우고 멈춘다. 명령 재실행이나 산출물 수집으로 해소 가능한 evidence 공백은 사용자 리뷰 요청이 아니다.

## 배경

두 번째 구현은 roadmap/phase diff를 정리했고 Flutter tests도 통과했다. 그러나 auth/token 계약이 여전히 후속 계획의 의미와 다르다.

- Public API가 `token`이라는 실제 토큰 값처럼 보이는 field를 제공한다.
- Test fixture에 `supersecrettoken`이라는 secret-like 문자열이 들어갔고 UI가 `supersec...`를 표시하는지 검증한다.

이 작업은 auth reference 계약을 명확히 하고 tracked source/test에서 secret-like token 문자열을 제거하는 데만 집중한다.

## 사용자 리뷰 요청 흐름

구현 중 차단이 생기면 active `CODE_REVIEW-cloud-G06.md`의 `사용자 리뷰 요청` 섹션을 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md` 형식으로 채운다. code-review가 정당성을 확인하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다.

## 범위 결정 근거

- `packages/flutter/iop_console/lib/src/iop_console_contract.dart`, `packages/flutter/iop_console/lib/src/iop_console_overview.dart`, `packages/flutter/iop_console/test/iop_console_shell_test.dart`만 수정 대상으로 둔다.
- Roadmap/phase 문서는 이미 정리되었으므로 다시 수정하지 않는다.
- `apps/client/**` 통합은 후속 split task 범위로 남긴다. 다만 package public API 변경이므로 verification으로 `apps/client` test를 함께 실행한다.

## 빌드 등급

- build lane: `cloud-G06`; review lane: `cloud-G06`.
- 공개 API 의미 보정과 test fixture 정리이며 검증 명령이 명확하다.

## 구현 체크리스트

- [ ] `IopConsoleConfig`의 auth field를 실제 token 값이 아니라 host-owned reference임이 드러나는 public API로 바꾼다.
- [ ] overview/test에서 secret-like token 문자열과 실제 token masking 표시 검증을 제거하고 reference 표시 또는 reference 존재 검증으로 바꾼다.
- [ ] `cd packages/flutter/iop_console && flutter test`를 실행한다.
- [ ] `cd apps/client && flutter test`를 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## [REVIEW_REVIEW_API-1] Reference-Only Auth API

### 문제

`IopConsoleConfig.token`은 이름과 사용 위치가 실제 secret token 값을 package에 넘기는 API처럼 보인다. 이전 계획은 token lifecycle을 host가 소유하고 package에는 reference만 전달하도록 요구했다.

### 해결 방법

`token` field를 `authTokenReference` 같은 이름으로 바꾸거나, 작은 value type을 둔다.

권장 최소안:

```dart
class IopConsoleConfig {
  final String controlPlaneHttpUrl;
  final String controlPlaneWireUrl;
  final String? authTokenReference;
}
```

`IopConsoleOverview`가 표시해야 한다면 label도 `Auth Token Reference` 또는 `Auth Reference`로 두고, value는 reference identifier만 표시한다. 실제 secret masking 유틸처럼 동작하게 만들지 않는다.

### 수정 파일 및 체크리스트

- [ ] `packages/flutter/iop_console/lib/src/iop_console_contract.dart`에서 `token`을 reference API로 교체한다.
- [ ] `packages/flutter/iop_console/lib/src/iop_console_overview.dart`에서 새 reference API를 사용한다.
- [ ] 기존 call site가 깨지지 않도록 optional/default 형태를 유지한다.

### 중간 검증

```bash
cd packages/flutter/iop_console && flutter test
```

기대: 모든 package test 통과.

## [REVIEW_REVIEW_API-2] Secret-Free Test Fixture

### 문제

`packages/flutter/iop_console/test/iop_console_shell_test.dart`에 `supersecrettoken`이 들어갔고, UI가 `supersec...`를 표시하는지 확인한다. 프로젝트 local client-smoke 규칙은 secret/token 원문을 tracked 파일에 기록하지 말라고 한다.

### 해결 방법

테스트 입력은 secret처럼 보이지 않는 reference identifier로 바꾼다. 예:

```dart
authTokenReference: 'cp-auth-ref-main',
```

기대값도 masking된 secret prefix가 아니라 reference identifier 또는 "configured" 상태처럼 비밀이 아닌 값을 확인한다.

### 수정 파일 및 체크리스트

- [ ] `packages/flutter/iop_console/test/iop_console_shell_test.dart`에서 secret-like literal을 제거한다.
- [ ] `packages/flutter/iop_console/test/iop_console_shell_test.dart`에서 reference contract를 import/instantiate하고 UI 또는 config value로 검증한다.
- [ ] `rg -n "secret|token|supersec" packages/flutter/iop_console/lib packages/flutter/iop_console/test`로 secret-like fixture가 남지 않는지 확인한다. 단, API명 `authTokenReference`나 문서상 일반 단어 `token reference`는 허용된다.

### 중간 검증

```bash
rg -n "supersecret|supersec|secrettoken" packages/flutter/iop_console/lib packages/flutter/iop_console/test
```

기대: 출력 없음.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `packages/flutter/iop_console/lib/src/iop_console_contract.dart` | REVIEW_REVIEW_API-1 |
| `packages/flutter/iop_console/lib/src/iop_console_overview.dart` | REVIEW_REVIEW_API-1 |
| `packages/flutter/iop_console/test/iop_console_shell_test.dart` | REVIEW_REVIEW_API-2 |

## 최종 검증

```bash
cd packages/flutter/iop_console && flutter test
cd apps/client && flutter test
```

기대: 두 명령 모두 `All tests passed!`

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
