<!-- task=m-backtest-scenario-automation/04_remote_env_sync plan=1 tag=REVIEW_REVIEW_TEST -->

# Remote Env Sync Follow-up Plan

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

이 plan은 `code_review_cloud_G07_0.log`의 Required 이슈만 좁게 해결한다. 구현 완료 후 `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 채우고 active 파일을 유지한 채 리뷰 준비를 보고한다. 종결, log rename, `complete.log`, archive 이동은 code-review 전용이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 범위 충돌 없이는 진행할 수 없으면 review stub의 `사용자 리뷰 요청`에 정확한 근거를 남기고 멈춘다. 구현 에이전트는 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하거나 `USER_REVIEW.md`를 만들지 않는다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/backtest-loop/milestones/backtest-scenario-automation.md`
- Task ids:
  - `remote-env-sync`: 원격 테스트 checkout과 실제 실행 checkout을 하나로 맞추고 DB/Redis health 및 현재 checkout의 worker migration 적용 절차/evidence를 남긴다.
- Completion mode: check-on-pass

## 범위 결정 근거

이 후속은 `remote-env-sync` PASS를 막은 리뷰 artifact 신뢰도와 범위 drift만 정리한다. 새로운 scenario 동작, runtime startup, result polling fixture behavior 변경은 이번 split 범위가 아니다. `code_review_cloud_G07_0.log`는 active task 디렉터리 안의 이전 리뷰 로그이며 raw host/path evidence가 남아 있으므로, 이번 후속에서 sanitized evidence로 정리한다.

## 구현 체크리스트

- [ ] `code_review_cloud_G07_0.log`와 새 active review evidence에서 raw remote host/path, 개인 endpoint, Docker binary absolute path, DB/Redis credential 값을 제거한다.
- [ ] `runtime-startup`/`result-poll`/scenario fixture 관련 범위 밖 변경을 이번 split에서 제거했음을 diff로 확인한다.
- [ ] remote runner checkout, `code-server` 실행 checkout, 최신 migration file version, remote DB schema version evidence를 서로 모순 없이 sanitized 형태로 다시 기록한다.
- [ ] `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_TEST-1] Sanitize task evidence and clear invalid user-review request

#### 문제

`code_review_cloud_G07_0.log`에는 raw remote host/path, platform-specific Docker binary path, DB URI/log label이 남아 있다. 또한 구현자가 작성한 `사용자 리뷰 요청`은 host `go`/`psql` 부재를 차단 사유로 들지만 같은 파일의 검증 출력에는 `docker exec` 기반 migration과 `psql` 확인이 성공한 것으로 기록되어 user-review gate 근거가 모순된다.

#### 해결 방법

task evidence에서는 `<ALT_REMOTE_SSH>`, `<ALT_REMOTE_ALT_ROOT>`, `<DOCKER_BIN>`, `<CONTAINER_ALT_ROOT>`, `<DATABASE_URL>`, `<REDIS_URL>`, `<DB_USER>`, `<DB_NAME>` 같은 placeholder만 사용한다. 이전 리뷰 로그의 raw evidence를 redacted/sanitized 형태로 바꾸고, 새 active review의 `사용자 리뷰 요청`은 사용자 결정이 실제로 필요하지 않으면 기본 `상태: 없음`을 유지한다. 실제 외부 환경 차단이 다시 발생하면 raw host/path 없이 명령, 출력, 자동 후속 불가 이유, 재개 조건을 기록한다.

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

- [ ] `agent-task/m-backtest-scenario-automation/04_remote_env_sync/code_review_cloud_G07_0.log`의 raw host/path/credential evidence를 placeholder로 정리한다.
- [ ] 새 `CODE_REVIEW-cloud-G07.md`에는 raw host/path/credential 값과 모순된 user-review request를 남기지 않는다.

#### 테스트 작성

새 unit test는 작성하지 않는다. task evidence sanitization은 `rg` 검증으로 확인한다.

#### 중간 검증

```bash
rg --sort path -n "nomadcode[:]nomadcode|ssh toki[@]|(^|[^[:alnum:].-])toki-labs[.]com|/Users[/]toki|/Applications[/]Docker[.]app" apps/cli/testdata/operator/headless_validation.md agent-task/m-backtest-scenario-automation/04_remote_env_sync/code_review_cloud_G07_0.log agent-task/m-backtest-scenario-automation/04_remote_env_sync/CODE_REVIEW-cloud-G07.md
```

기대 결과: exit code 1 또는 출력 없음.

### [REVIEW_REVIEW_TEST-2] Remove remaining out-of-scope fixture/test/roadmap drift

#### 문제

`code_review_cloud_G07_0.log`에서 Required로 지적했듯이 `worker-available` capability, `backtest_result_summary` polling step/expected fixture/test, `runtime-startup`/`result-poll` roadmap wording 변경이 남아 있다. 이전 plan의 `REVIEW_TEST-2`는 이 변경들을 제거하라고 명시했다.

#### 해결 방법

이번 split에는 `remote-env-sync` 문서/evidence 변경만 남긴다. `runtime-startup`, `result-poll`, scenario polling fixture/test 변경은 다음 split에서 다룰 수 있도록 source diff에서 제거한다. 되돌릴 때 현재 worktree의 다른 사용자 변경을 보존하고 해당 hunks만 수동으로 정리한다.

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

- [ ] `apps/cli/testdata/operator/api_connection_smoke.yaml`의 `worker-available` 추가를 제거한다.
- [ ] `apps/cli/testdata/operator/backtest_result_summary.yaml`의 `poll_backtest_run` step 추가를 제거한다.
- [ ] `apps/cli/testdata/operator/expected/backtest_result_summary.jsonl`의 poll line과 summary count 변경을 제거한다.
- [ ] `apps/cli/internal/operator/handoff_test.go`의 `TestResultSummaryFixturePollsBeforeResult` 추가를 제거한다.
- [ ] `agent-roadmap/phase/backtest-loop/milestones/backtest-scenario-automation.md`에서 이번 split 범위를 넘는 `runtime-startup`/`result-poll` 문구 변경을 제거한다. roadmap 상태 체크나 Task 완료 처리는 하지 않는다.

#### 테스트 작성

새 unit test는 작성하지 않는다. 범위 밖 test 추가를 제거하는 작업이다.

#### 중간 검증

```bash
git diff -- apps/cli/testdata/operator/api_connection_smoke.yaml apps/cli/testdata/operator/backtest_result_summary.yaml apps/cli/testdata/operator/expected/backtest_result_summary.jsonl apps/cli/internal/operator/handoff_test.go agent-roadmap/phase/backtest-loop/milestones/backtest-scenario-automation.md
rg --sort path -n "worker-available|poll_backtest_run" apps/cli/testdata/operator/api_connection_smoke.yaml apps/cli/testdata/operator/backtest_result_summary.yaml apps/cli/testdata/operator/expected/backtest_result_summary.jsonl apps/cli/internal/operator/handoff_test.go
```

기대 결과: diff에는 `remote-env-sync` 범위를 넘는 scenario fixture/test hunk가 남지 않는다. `rg`는 exit code 1 또는 출력 없음.

### [REVIEW_REVIEW_TEST-3] Rebuild coherent checkout and migration evidence

#### 문제

현재 로그는 같은 검증에 대해 host toolchain 부재로 차단되었다는 기록과 `docker exec` 기반 성공 기록을 동시에 담고 있어 verification trust가 깨졌다. 또한 sanitization 검증 자체도 누락된 `code_review_cloud_G07_0.log`를 참조해 exit code 2가 되었고, 실제 active review raw host/path 출력과 맞지 않았다.

#### 해결 방법

계획된 원격 evidence를 다시 수집하거나 기존 출력을 검증 가능한 sanitized form으로 정리한다. 기록은 host checkout, container checkout, latest migration file version, remote DB schema version을 같은 checkout 기준으로 연결해야 한다. host toolchain이 아니라 `docker exec` 기반 검증을 사용했다면 그 사실을 계획 대비 변경 사항 또는 설계 결정에 명시하고, 왜 원 plan과 동등한지 적는다.

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

- [ ] 새 `CODE_REVIEW-cloud-G07.md`의 검증 결과에 host checkout evidence를 sanitized 형태로 기록한다.
- [ ] 새 `CODE_REVIEW-cloud-G07.md`의 검증 결과에 `code-server` 컨테이너 내부 checkout evidence를 sanitized 형태로 기록한다.
- [ ] 새 `CODE_REVIEW-cloud-G07.md`의 검증 결과에 현재 checkout 최신 `*.up.sql` migration version 산출 출력과 remote DB `schema_migrations` max version 출력을 함께 기록한다.
- [ ] 검증 결과에는 실제 stdout/stderr 또는 저장된 출력 파일 경로를 기록하고, 요약만으로 대체하지 않는다.

#### 테스트 작성

새 unit test는 작성하지 않는다. 이 항목은 remote infra/migration evidence 보강이다.

#### 중간 검증

```bash
find services/worker/internal/storage/postgres/migrations -maxdepth 1 -name "*.up.sql" | sort
ssh "$ALT_REMOTE_SSH" "set -euo pipefail; cd \"$ALT_REMOTE_ALT_ROOT\"; git rev-parse --show-toplevel; git rev-parse HEAD; git status --short"
ssh "$ALT_REMOTE_SSH" "<DOCKER_BIN> exec code-server bash -lc 'cd <CONTAINER_ALT_ROOT> && git rev-parse --show-toplevel && git rev-parse HEAD && git status --short'"
ssh "$ALT_REMOTE_SSH" "<DOCKER_BIN> exec code-server bash -lc 'cd <CONTAINER_ALT_ROOT>/services/worker && DATABASE_URL=<DATABASE_URL> REDIS_URL=<REDIS_URL> go run ./cmd/alt-worker-migrate'"
ssh "$ALT_REMOTE_SSH" "<DOCKER_BIN> exec code-server-postgres psql -U <DB_USER> -d <DB_NAME> -t -A -c 'select max(version) from schema_migrations;'"
```

기대 결과: host/container checkout commit과 의도된 dirty 상태가 일치한다. 최신 migration file version은 remote DB max version 이하이다. 검증 출력에는 raw host/path/credential이 없다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `agent-task/m-backtest-scenario-automation/04_remote_env_sync/code_review_cloud_G07_0.log` | REVIEW_REVIEW_TEST-1 |
| active review stub | REVIEW_REVIEW_TEST-1, REVIEW_REVIEW_TEST-3 |
| `apps/cli/testdata/operator/api_connection_smoke.yaml` | REVIEW_REVIEW_TEST-2 |
| `apps/cli/testdata/operator/backtest_result_summary.yaml` | REVIEW_REVIEW_TEST-2 |
| `apps/cli/testdata/operator/expected/backtest_result_summary.jsonl` | REVIEW_REVIEW_TEST-2 |
| `apps/cli/internal/operator/handoff_test.go` | REVIEW_REVIEW_TEST-2 |
| `agent-roadmap/phase/backtest-loop/milestones/backtest-scenario-automation.md` | REVIEW_REVIEW_TEST-2 |

## 최종 검증

```bash
git diff --check
go test -count=1 ./apps/cli/internal/operator ./apps/cli/internal/cli
rg --sort path -n "worker-available|poll_backtest_run" apps/cli/testdata/operator/api_connection_smoke.yaml apps/cli/testdata/operator/backtest_result_summary.yaml apps/cli/testdata/operator/expected/backtest_result_summary.jsonl apps/cli/internal/operator/handoff_test.go
rg --sort path -n "nomadcode[:]nomadcode|ssh toki[@]|(^|[^[:alnum:].-])toki-labs[.]com|/Users[/]toki|/Applications[/]Docker[.]app" apps/cli/testdata/operator/headless_validation.md agent-task/m-backtest-scenario-automation/04_remote_env_sync/code_review_cloud_G07_0.log agent-task/m-backtest-scenario-automation/04_remote_env_sync/CODE_REVIEW-cloud-G07.md
```

기대 결과: `git diff --check`와 Go test는 exit code 0. 두 `rg` 명령은 exit code 1 또는 출력 없음. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
