<!-- task=m-backtest-scenario-automation/05+04_runtime_startup plan=1 tag=REVIEW_TEST -->

# Runtime Startup Follow-up Plan

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

이 plan은 `code_review_cloud_G08_0.log`의 Required 이슈만 해결한다. 구현 완료 후 `CODE_REVIEW-cloud-G08.md`의 구현 에이전트 소유 섹션을 실제 결과와 검증 stdout/stderr로 채우고 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:
  - `runtime-startup`: 원격 worker/API 실행 순서를 `migration -> worker -> API -> CLI scenario`로 정리하고 worker availability 및 import typed success를 검증한다.
- Completion mode: check-on-pass

## 범위 결정 근거

이 후속은 implementation-ready 상태를 복구하고, 선행 `04_remote_env_sync` 완료 이후 `runtime-startup` evidence를 실제로 수집하는 데만 집중한다. DB/Redis/migration 정합성 자체는 `04_remote_env_sync`가 소유한다. matrix seed와 result polling 안정화는 후속 `06+05_matrix_seed`, `07+05_result_poll_remote` 범위다. roadmap 상태 변경은 하지 않는다.

## 구현 체크리스트

- [ ] `04_remote_env_sync` complete.log가 active 또는 archive 경로에 있는지 확인하고 경로를 기록한다.
- [ ] 선행 complete.log가 확인된 뒤 원격 runner에서 migration 이후 worker를 SOPS env wrapper와 DB/Redis env로 기동하고 `worker ready` 로그의 store-backed surface flags를 sanitized로 기록한다.
- [ ] 원격 runner에서 API를 `ALT_WORKER_SOCKET_URL`과 bind host/port를 명시해 기동하고 worker 연결 상태를 sanitized log tail로 기록한다.
- [ ] `api_connection_smoke.yaml`이 `worker-available` capability를 요구하는 상태에서 원격 API socket을 대상으로 exit code 0과 JSONL evidence를 기록한다.
- [ ] `backtest_result_summary.yaml` 또는 동등한 import/backtest scenario의 import step typed success를 원격 JSONL evidence로 기록한다.
- [ ] runtime startup 과정에서 생성한 worker/API process를 정리하고 cleanup command와 결과를 기록한다.
- [ ] `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_TEST-1] Predecessor-gated runtime startup evidence

#### 문제

`code_review_cloud_G08_0.log`는 구현 체크리스트가 모두 미완료이고 실제 검증 출력이 없다. 또한 `PLAN-cloud-G08.md:75`-`81`이 요구한 `04_remote_env_sync` `complete.log`가 없어서 `05+04_runtime_startup` 구현 시작 조건이 충족되지 않았다.

#### 해결 방법

먼저 `04_remote_env_sync`의 active 또는 archived `complete.log`를 확인한다. 없으면 원격 process를 기동하지 말고 predecessor missing evidence만 review stub에 기록한다. complete.log가 있으면 같은 원격 checkout 기준으로 migration, worker startup, API startup, CLI smoke, import typed success, cleanup 순서의 실제 stdout/stderr를 sanitized 형태로 기록한다.

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

- [ ] `CODE_REVIEW-cloud-G08.md` - predecessor complete.log 경로, worker/API startup output, CLI smoke output, cleanup output을 기록한다.
- [ ] `apps/cli/testdata/operator/headless_validation.md` - runtime startup handoff 절차 보강이 필요할 때만 raw 값 없이 수정한다.

#### 테스트 작성

새 unit test는 작성하지 않는다. 이 작업의 성공 기준은 원격 runtime process와 API-worker 연결 smoke이다. 소스 변경이 발생하면 변경 도메인의 regression test를 추가하고 `계획 대비 변경 사항`에 사유를 남긴다.

#### 중간 검증

```bash
go test -count=1 ./apps/cli/internal/operator ./services/api/internal/socket ./services/worker/...
test -f agent-task/m-backtest-scenario-automation/04_remote_env_sync/complete.log || find agent-task/archive -path '*/m-backtest-scenario-automation/04_remote_env_sync/complete.log' -print -quit
```

기대 결과: Go test는 exit code 0. predecessor complete.log 경로가 하나 출력된다. complete.log가 없으면 runtime startup 명령을 실행하지 않는다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| active review stub | REVIEW_TEST-1 evidence 기록 |
| `apps/cli/testdata/operator/headless_validation.md` | REVIEW_TEST-1, 필요 시 절차 보강 |

## 최종 검증

```bash
git diff --check
go test -count=1 ./apps/cli/internal/operator ./services/api/internal/socket ./services/worker/...
test -f agent-task/m-backtest-scenario-automation/04_remote_env_sync/complete.log || find agent-task/archive -path '*/m-backtest-scenario-automation/04_remote_env_sync/complete.log' -print -quit
ssh "$ALT_REMOTE_SSH" "set -euo pipefail; cd \"$ALT_REMOTE_ALT_ROOT/services/worker\"; go run ./cmd/alt-worker-migrate"
ssh "$ALT_REMOTE_SSH" "set -euo pipefail; cd \"$ALT_REMOTE_ALT_ROOT\"; bin/kis-sops-env sh -lc 'go run ./services/worker/cmd/alt-worker' > /tmp/alt-worker.log 2>&1 & echo \$! > /tmp/alt-worker.pid"
ssh "$ALT_REMOTE_SSH" "set -euo pipefail; cd \"$ALT_REMOTE_ALT_ROOT\"; ALT_WORKER_SOCKET_URL=\"ws://127.0.0.1:18031/socket\" go run ./services/api/cmd/alt-api > /tmp/alt-api.log 2>&1 & echo \$! > /tmp/alt-api.pid"
ssh "$ALT_REMOTE_SSH" "set -euo pipefail; cd \"$ALT_REMOTE_ALT_ROOT/apps/cli\"; go run ./cmd/alt operator scenario run --file testdata/operator/api_connection_smoke.yaml --api-url \"ws://127.0.0.1:18030/socket\" --output jsonl"
ssh "$ALT_REMOTE_SSH" "set -euo pipefail; cd \"$ALT_REMOTE_ALT_ROOT/apps/cli\"; go run ./cmd/alt operator scenario run --file testdata/operator/backtest_result_summary.yaml --api-url \"ws://127.0.0.1:18030/socket\" --output jsonl"
ssh "$ALT_REMOTE_SSH" "set -euo pipefail; test ! -f /tmp/alt-api.pid || kill \"$(cat /tmp/alt-api.pid)\"; test ! -f /tmp/alt-worker.pid || kill \"$(cat /tmp/alt-worker.pid)\"; rm -f /tmp/alt-api.pid /tmp/alt-worker.pid"
```

기대 결과: local 명령 exit code 0. predecessor complete.log 확인. 원격 API smoke는 `worker-available` 기대를 만족하고 exit code 0. result summary 또는 동등 scenario는 import step typed success를 포함한다. worker/API startup log tail과 cleanup 결과가 review stub에 기록된다. raw secret/env 값은 task artifact에 남기지 않는다.
