<!-- task=m-oto-registration-unlock-handoff/02+01_unlock_evidence_handoff plan=1 tag=REVIEW_ORU02 -->

# Review Follow-up - OTO Registration Unlock Evidence Handoff

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

`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션 작성은 필수다. 구현 후 검증을 실행하고 실제 변경 내용과 stdout/stderr를 채운 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 사용자 결정, 사용자 소유 외부 환경, 또는 범위 충돌 없이는 진행할 수 없을 때만 review stub의 `사용자 리뷰 요청` 섹션에 근거를 적고 중단한다. 재실행으로 해소 가능한 증거 공백은 사용자 리뷰 요청이 아니다.

## 배경

이 후속 plan은 `plan_cloud_G07_0.log` / `code_review_cloud_G07_0.log`의 FAIL 후속이다. 첫 루프는 선행 상태와 lock target을 잘 기록했지만, Roadmap Targets의 check-on-pass 조건인 upstream/online/failure/retry evidence가 실제로 충족되지 않아 task를 완료할 수 없었다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-unlock-handoff.md`
- Task ids:
  - `upstream-complete`: `OTO Agent Registry 구현`, `OTO Bootstrap Command 발급`, `OTO Registration Online Smoke`가 [검토중] 또는 [완료] 상태이며 각 완료 근거가 확인되어 있다.
  - `online-evidence`: registration accepted와 최초 heartbeat 이후 online 전환이 같은 smoke evidence 안에서 확인된다.
  - `failure-retry`: unknown token, duplicate connection, heartbeat timeout, bootstrap/registration 실패 reason과 retry 기준이 OTO가 소비할 수 있는 형태로 요약되어 있다.
  - `lock-sync-ready`: OTO lock entry에서 `iop2oto:agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-unlock-handoff.md`를 `enable`로 동기화할 수 있는 완료 근거가 남는다.
- Completion mode: check-on-pass

## 실패 원인

- `oto-registration-unlock-handoff.md`의 `upstream-complete`, `online-evidence`, `failure-retry`, `lock-sync-ready` Task가 `[ ]`로 남아 있어 milestone completion을 주장할 수 없다.
- 선행 상태가 아직 `OTO Agent Registry 구현` [진행중], `OTO Bootstrap Command 발급` [계획], `OTO Registration Online Smoke` [계획]이므로 accepted/heartbeat/failure/retry evidence handoff가 완성되지 않았다.
- `01_node_interface_parity` predecessor는 `agent-task/archive/2026/06/m-oto-registration-unlock-handoff/01_node_interface_parity/complete.log`에서 PASS로 확인된다. 후속 구현은 이 내용을 직접 근거로 기록한다.

## 구현 체크리스트

- [ ] `01_node_interface_parity`의 archived `complete.log` 내용을 직접 확인하고 predecessor PASS 근거를 review stub에 기록한다.
- [ ] `OTO Agent Registry 구현`, `OTO Bootstrap Command 발급`, `OTO Registration Online Smoke`가 모두 [검토중] 또는 [완료]이며 완료 근거가 있는지 확인한다.
- [ ] 선행 gate가 아직 미충족이면 `oto-registration-unlock-handoff.md`의 `선행 상태 점검`을 최신 상태로 갱신하고, 완료 Task를 체크하지 않은 채 evidence gap을 기록한다.
- [ ] 선행 gate가 충족되면 registration accepted, 최초 heartbeat 이후 online 전환, unknown token, duplicate connection, heartbeat timeout, bootstrap/registration 실패 reason과 retry 기준을 OTO가 소비할 수 있는 문장으로 `oto-registration-unlock-handoff.md`에 정리한다.
- [ ] `roadmap-dependency-checker.sh --find-milestone`으로 handoff Milestone이 OTO lock의 `rely-on` target인지 재확인하고, enable 동기화 조건과 현재 status를 문서화한다.
- [ ] `go test -count=1 ./apps/edge/... ./packages/go/config`, lock checker, `git diff --check`를 실행하고 실제 stdout/stderr를 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_ORU02-1] Complete or explicitly re-block evidence handoff

#### 문제

첫 루프는 upstream gate 미충족을 문서화했지만, Roadmap Targets의 완료 대상 Task를 충족하지 못했다. `check-on-pass` milestone task는 선행 완료 근거와 online/failure evidence가 모두 있어야 PASS로 닫을 수 있다.

#### 해결 방법

선행 milestone 세 개의 현재 상태와 완료 evidence를 다시 확인한다. 모두 [검토중] 또는 [완료]이면 online smoke evidence에서 accepted/first heartbeat/failure/retry 기준을 수집해 handoff 문서에 넣고 관련 Task를 근거와 함께 완료한다. 아직 미충족이면 handoff 문서의 dated status record만 최신화하고, `사용자 리뷰 요청`이 아니라 repo-owned evidence gap으로 남긴다.

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

- [ ] `agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-unlock-handoff.md`: 선행 상태, online/failure/retry evidence, lock sync readiness를 실제 상태에 맞게 갱신한다.
- [ ] `/config/workspace/.agent-roadmap-sync/locks.yaml`: 직접 enable로 바꾸지 않는다. Milestone이 [검토중] 또는 [완료]가 된 뒤 runtime/update-roadmap 동기화 대상임을 문서화만 한다.

#### 테스트 작성

테스트 작성은 건너뛴다. 이 follow-up은 roadmap evidence handoff이며 동작 변경이 없다. 다만 관련 Edge/config 회귀와 lock target 판별은 필수 검증으로 실행한다.

#### 중간 검증

```bash
rg --sort path -n 'OTO Agent Registry 구현|OTO Bootstrap Command 발급|OTO Registration Online Smoke|upstream-complete|online-evidence|failure-retry|lock-sync-ready|선행 상태 점검|lock sync readiness' agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-unlock-handoff.md
```

## 의존 관계 및 구현 순서

1. `01_node_interface_parity` archived `complete.log`를 확인한다.
2. `PHASE.md`와 세 선행 milestone 문서에서 상태와 완료 evidence를 확인한다.
3. gate 미충족이면 최신 blocker record를 남기고 완료 Task는 그대로 둔다.
4. gate 충족이면 accepted/heartbeat/failure/retry handoff를 완성한다.
5. lock checker와 Go 테스트, diff check를 실행한다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-unlock-handoff.md` | REVIEW_ORU02-1 |
| `/config/workspace/.agent-roadmap-sync/locks.yaml` | 직접 수정 금지, checker 판별만 |

## 최종 검증

```bash
go test -count=1 ./apps/edge/... ./packages/go/config
../oto/agent-ops/bin/roadmap-dependency-checker.sh --find-milestone "iop2oto:agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-unlock-handoff.md" rely-on "/config/workspace/.agent-roadmap-sync/locks.yaml"
git diff --check
```

예상 결과: Go 테스트 PASS, lock checker가 `rely-on:oto:oto-agent-registration`를 출력, 공백 오류 없음.

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