<!-- task=m-backtest-scenario-automation/04_remote_env_sync plan=1 tag=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` 완료를 막는 보안/범위/검증 증거 문제만 처리한다. `runtime-startup`, `result-poll`, scenario fixture behavior 변경은 이번 split의 완료 조건이 아니므로 되돌리거나 별도 후속 split으로 넘긴다. roadmap 상태 변경이나 Task 체크는 code-review/implementation 범위가 아니며 런타임 완료 이벤트가 처리한다.

## 구현 체크리스트

- [ ] tracked 문서와 task evidence에서 raw remote host/path 및 DB/Redis credential 값을 제거하고 placeholder 기반 절차로 정리한다.
- [ ] `runtime-startup`/`result-poll`/scenario fixture 관련 범위 밖 변경을 이번 split에서 제거하거나 별도 후속 split으로 이동했음을 diff로 확인한다.
- [ ] remote runner checkout, `code-server` 실행 checkout, 최신 migration file version, remote DB schema version을 같은 현재 checkout 기준으로 sanitized evidence로 다시 기록한다.
- [ ] `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_TEST-1] Sanitize remote/credential evidence

#### 문제

`apps/cli/testdata/operator/headless_validation.md:93`에 raw `DATABASE_URL` credential 형태가 tracked 문서로 들어갔다. `code_review_cloud_G07_0.log`의 active evidence는 리뷰 중 placeholder로 정리했지만, 소스 문서에 남은 raw 값은 프로젝트/operations/worker 규칙과 원 plan의 secret 기록 금지 조건을 위반한다.

#### 해결 방법

원격 절차 문서의 command 예시는 `<ALT_REMOTE_SSH>`, `<ALT_REMOTE_ALT_ROOT>`, `<DOCKER_BIN>`, `<CONTAINER_ALT_ROOT>`, `<DATABASE_URL>`, `<REDIS_URL>` 같은 placeholder로만 작성한다. 컨테이너 이름처럼 non-secret operational label은 유지 가능하지만, 사용자/비밀번호가 들어간 URI, 개인 host, 개인 absolute path, platform-specific Docker binary path는 tracked 문서나 active review evidence에 남기지 않는다.

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

- [ ] `apps/cli/testdata/operator/headless_validation.md`의 원격 절차에서 raw credential/endpoint/path를 제거한다.
- [ ] `agent-task/m-backtest-scenario-automation/04_remote_env_sync/code_review_cloud_G07_0.log`에 raw host/path/credential이 남아 있지 않은지 확인한다.

#### 테스트 작성

새 unit test는 작성하지 않는다. 문서/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
```

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

### [REVIEW_TEST-2] Remove out-of-scope scenario and roadmap drift

#### 문제

`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`에 `runtime-startup`/`result-poll` 성격의 변경이 섞였다. 원 plan은 이 작업을 checkout/infra/migration evidence로 제한했고, runtime startup과 result polling fixture/code 변경은 후속 split으로 제외했다.

#### 해결 방법

이번 split에서 도입된 `worker-available` capability 요구, `backtest_result_summary` polling step/expected fixture/test, `runtime-startup`/`result-poll` roadmap 문구 변경을 제거한다. 단, `remote-env-sync` 자체 설명을 명확히 하는 기존 계획 범위의 문서 보강은 유지할 수 있다. 되돌릴 때는 현재 worktree의 다른 사용자 변경을 보존하고 해당 hunks만 수동으로 정리한다.

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

- [ ] `apps/cli/testdata/operator/api_connection_smoke.yaml`의 `worker-available` 추가를 제거한다.
- [ ] `apps/cli/testdata/operator/backtest_result_summary.yaml`와 expected JSONL의 polling step 변경을 제거한다.
- [ ] `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 완료 처리는 하지 않는다.

#### 테스트 작성

새 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
```

기대 결과: `remote-env-sync` 문서/evidence 범위를 넘는 scenario fixture/test hunk가 남지 않는다.

### [REVIEW_TEST-3] Rebuild checkout and migration evidence

#### 문제

`code_review_cloud_G07_0.log`에는 원격 host checkout과 DB max version은 있지만, 실제 실행 checkout인 `code-server` 컨테이너 내부 checkout의 `git rev-parse`/`git status`와 현재 checkout의 최신 migration file version 산출 근거가 없다. 같은 checkout 기준 migration 적용 evidence로 보기에는 검증이 불완전하다.

#### 해결 방법

같은 remote session에서 host checkout, container checkout, 최신 migration file version, remote DB schema version을 모두 수집한다. 출력은 raw host/path/credential 없이 placeholder로 기록한다. remote DB version은 최신 local/current checkout migration file version 이상이어야 한다.

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

- [ ] `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 출력을 함께 기록한다.

#### 테스트 작성

새 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이 없다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/cli/testdata/operator/headless_validation.md` | REVIEW_TEST-1 |
| `apps/cli/testdata/operator/api_connection_smoke.yaml` | REVIEW_TEST-2 |
| `apps/cli/testdata/operator/backtest_result_summary.yaml` | REVIEW_TEST-2 |
| `apps/cli/testdata/operator/expected/backtest_result_summary.jsonl` | REVIEW_TEST-2 |
| `apps/cli/internal/operator/handoff_test.go` | REVIEW_TEST-2 |
| `agent-roadmap/phase/backtest-loop/milestones/backtest-scenario-automation.md` | REVIEW_TEST-2 |
| active review stub | REVIEW_TEST-3 evidence 기록 |

## 최종 검증

```bash
git diff --check
go test -count=1 ./apps/cli/internal/operator ./apps/cli/internal/cli
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`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
