<!-- task=01_command_runtime_contract plan=1 tag=REVIEW_REVIEW_REFACTOR -->

# Command Runtime Contract Review Follow-up

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

**구현의 마지막 단계는 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채우는 것이다. 이 파일이 채워지기 전에는 작업이 완료된 것이 아니다.** 구현 체크리스트를 기준으로 작업하고, 중간/최종 검증을 실행한 뒤 실제 구현 내용과 stdout/stderr를 review stub에 기록한다. review 파일의 archive/complete.log 지시는 코드리뷰 스킬 전용이며 구현 에이전트가 실행하거나 `코드리뷰 전용 체크리스트`를 수정하면 안 된다.

## 배경

1차 리뷰에서 SFTP runtime helper 자체는 요청된 주요 호출에 적용된 것을 확인했다. 다만 최종 검증 기록과 현재 재실행 결과가 불일치했고, 구현 소유 문서가 실제 diff의 계획 외 변경을 정확히 설명하지 않았다. 이 follow-up은 런타임 구현을 새로 확장하기보다, 검증 신뢰와 task 기록을 회복하는 데 집중한다.

## 분석 결과

### 읽은 파일

- `agent-task/01_command_runtime_contract/code_review_cloud_G07_0.log`
- `agent-task/01_command_runtime_contract/plan_cloud_G07_0.log`
- `lib/oto/commands/ftp/download.dart`
- `lib/oto/commands/ftp/ftp.dart`
- `lib/oto/commands/ftp/upload.dart`
- `test/oto_command_runtime_test.dart`
- `test/oto_command_catalog_test.dart`
- `agent-task/03_command_catalog_samples/PLAN-local-G05.md`

### 리뷰 실패 사유

- `dart test test/oto_command_runtime_test.dart`는 리뷰 재실행에서 통과했다.
- `dart analyze`는 리뷰 재실행에서 통과했다.
- `dart test`는 리뷰 재실행에서 실패했다. 실패 위치는 `test/oto_command_catalog_test.dart`의 samplePath containment 검사이며, 현재 워크스페이스의 `03_command_catalog_samples` 관련 partial 변경과 연결되어 보인다.
- `code_review_cloud_G07_0.log`에는 계획 대비 변경이 없다고 되어 있으나, 실제 diff에는 `Download` map 방향/워크스페이스 정리, `Upload` 워크스페이스 정리, `FTP.connect()` retry 종료 동작 변경이 포함되어 있다.

### 범위 결정 근거

이 follow-up은 `01_command_runtime_contract`의 완료 신뢰 회복만 다룬다. sample/catalog 변경 자체는 `03_command_catalog_samples` task 범위이므로, 이 task에서는 sample/catalog 파일을 임의로 수정하지 않는다. `dart test`가 sibling task의 partial 변경 때문에 실패한다면 sibling task를 먼저 완료하거나 partial 변경이 없는 상태에서 이 task의 최종 검증을 다시 수행한다.

### 빌드 등급

build=`cloud-G07`, review=`cloud-G07`: 실패 원인이 검증 신뢰 불일치이고, 원래 task가 외부 CLI exit-status contract를 다루는 terminal-agent 성격이다.

## 구현 체크리스트

- [ ] [REVIEW_REVIEW_REFACTOR-1] 최종 검증 신뢰를 회복한다.
- [ ] [REVIEW_REVIEW_REFACTOR-2] 계획 외 변경과 구현 노트를 실제 코드와 일치시킨다.
- [ ] 중간 검증과 최종 검증 명령을 실행하고 결과를 확인한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_REFACTOR-1] 최종 검증 신뢰 회복

문제: [code_review_cloud_G07_0.log](/config/workspace/oto/agent-task/01_command_runtime_contract/code_review_cloud_G07_0.log:99)는 `dart test`가 통과했다고 기록하지만, 리뷰 재실행에서는 [oto_command_catalog_test.dart](/config/workspace/oto/test/oto_command_catalog_test.dart:57)가 실패했다.

해결 방법: 이 task를 다시 리뷰 가능 상태로 만들기 전에 정확히 같은 최종 검증 명령을 현재 워크스페이스에서 통과시킨다. 실패가 `03_command_catalog_samples`의 partial 변경 때문이면 해당 sibling task를 먼저 완료하거나, partial 변경이 섞이지 않은 상태에서 이 task 검증을 다시 수행한다. 검증 실패를 성공처럼 기록하지 않는다.

수정 파일 및 체크리스트:

- [ ] `dart test` 실패 원인이 `01_command_runtime_contract` 변경인지 sibling sample/catalog 변경인지 확인한다.
- [ ] sibling 변경이 원인이면 이 task에서 sample/catalog 파일을 임의 수정하지 않고, 워크스페이스 검증 가능 상태를 먼저 확보한다.
- [ ] `dart analyze`, `dart test test/oto_command_runtime_test.dart`, `dart test`의 실제 stdout/stderr를 새 review 파일에 기록한다.

테스트 작성: 추가 테스트는 원칙적으로 불필요하다. 기존 테스트가 실패하면 실패 원인에 맞춰 최소 수정한다.

중간 검증:

```bash
dart test
```

기대 결과: All tests passed.

### [REVIEW_REVIEW_REFACTOR-2] 계획 외 변경과 구현 노트 정합성

문제: [code_review_cloud_G07_0.log](/config/workspace/oto/agent-task/01_command_runtime_contract/code_review_cloud_G07_0.log:57)는 계획 대비 변경이 없다고 하지만, 실제 diff에는 계획 파일의 수정 파일 요약 밖 변경이 포함되어 있다. 또한 [code_review_cloud_G07_0.log](/config/workspace/oto/agent-task/01_command_runtime_contract/code_review_cloud_G07_0.log:63)는 `FakeRuntime.run()`도 stderr를 반영한다고 기록했지만 실제 코드는 `runExecutable`만 stderr fixture를 반영한다.

해결 방법: 실제 코드와 review 문서를 맞춘다. `Download` map 방향/워크스페이스 정리는 SFTP download E2E 테스트의 성공 계약과 연결되므로 유지한다면 `계획 대비 변경 사항`에 근거를 기록한다. `FTP.connect()` retry 종료 동작 변경은 이 task의 SFTP runtime contract 범위를 벗어나므로 제거하거나, 유지가 꼭 필요하다면 별도 근거와 검증을 명확히 기록한다. `FakeRuntime.run()` 설명은 실제 구현에 맞게 고치거나, 정말 필요한 경우 코드도 stderr를 반영하도록 수정한다.

수정 파일 및 체크리스트:

- [ ] `lib/oto/commands/ftp/ftp.dart`: `FTP.connect()` 변경을 이 task에 유지할지 판단하고, 범위 밖이면 제거한다.
- [ ] `agent-task/01_command_runtime_contract/CODE_REVIEW-cloud-G07.md`: 계획 대비 변경 사항과 주요 설계 결정을 실제 diff와 일치하게 작성한다.
- [ ] `test/oto_command_runtime_test.dart`: `FakeRuntime` 설명과 구현이 일치하는지 확인한다.

테스트 작성: `FTP.connect()` 변경을 유지한다면 별도 테스트 또는 검증 근거를 추가한다. 제거한다면 기존 runtime 테스트로 충분하다.

중간 검증:

```bash
dart test test/oto_command_runtime_test.dart
```

기대 결과: All tests passed.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `lib/oto/commands/ftp/ftp.dart` | REVIEW_REVIEW_REFACTOR-2 |
| `test/oto_command_runtime_test.dart` | REVIEW_REVIEW_REFACTOR-2 |
| `agent-task/01_command_runtime_contract/CODE_REVIEW-cloud-G07.md` | REVIEW_REVIEW_REFACTOR-1, REVIEW_REVIEW_REFACTOR-2 |

## 최종 검증

```bash
dart analyze
dart test test/oto_command_runtime_test.dart
dart test
```

기대 결과: `No issues found!`, targeted runtime test pass, full test pass.

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