<!-- task=m-scheduled-market-data-refresh/05+04_backtest_readiness plan=0 tag=cloud-G08 -->

# Plan - Backtest Readiness Handoff

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

이 plan은 `Scheduled Market Data Refresh` milestone handoff 에픽의 `backtest-readiness` roadmap target을 완료하기 위한 작업이다. 선행 `04+03_refresh_status_cli`가 PASS하고 `refresh-status` target이 체크된 뒤에만 시작한다.

## 배경

SDD S05는 scheduler tick으로 채워진 market data가 backtest matrix/result summary에서 정상적으로 쓰이며 exit code 0 evidence를 남기는 것을 요구한다. 현재 operator에는 backtest matrix/result summary fixture가 있지만, scheduler tick 이후 remote runner에서 import 없이 readiness를 증명하는 별도 handoff scenario는 없다.

## 사용자 리뷰 요청 흐름

remote runner에서 scheduler tick을 강제로 트리거하는 방법이 없거나, scheduler tick 대기 시간이 운영상 불명확하거나, backtest matrix가 seeded import에 의존해야만 통과한다면 작업을 멈추고 USER_REVIEW를 요청한다. credential, endpoint, provider secret은 기록하지 않는다.

## Archive Evidence Snapshot

- `agent-task/archive/2026/06/m-scheduled-market-data-refresh/01_scheduled_runner/complete.log`: S02 완료 PASS.
- `agent-task/archive/2026/06/m-scheduled-market-data-refresh/02_retry_backfill/complete.log`: S03 완료 PASS.
- 선행 active task 필요: `agent-task/m-scheduled-market-data-refresh/04+03_refresh_status_cli/complete.log`가 아직 없다. 구현 시작 전 반드시 확인한다.

## Roadmap Targets

- `agent-roadmap/phase/backtest-loop/milestones/scheduled-market-data-refresh.md`
  - Handoff epic: `[backtest-readiness] remote runner`

## 분석 결과

### 읽은 파일

- `agent-roadmap/current.md`
- `agent-roadmap/phase/backtest-loop/PHASE.md`
- `agent-roadmap/phase/backtest-loop/milestones/scheduled-market-data-refresh.md`
- `agent-roadmap/sdd/backtest-loop/scheduled-market-data-refresh/SDD.md`
- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/private/rules.md`
- `agent-ops/rules/common/rules-roadmap.md`
- `agent-ops/skills/common/router.md`
- `agent-ops/skills/common/plan/SKILL.md`
- `agent-test/local/rules.md`
- `agent-test/local/profiles/operations-smoke.md`
- `agent-test/local/profiles/api-smoke.md`
- `agent-test/local/profiles/worker-smoke.md`
- `agent-ops/rules/domain/operations/rules.md`
- `agent-ops/rules/domain/api/rules.md`
- `agent-ops/rules/domain/worker/rules.md`
- `apps/cli/internal/operator/scenario.go`
- `apps/cli/internal/operator/output.go`
- `apps/cli/internal/operator/runner.go`
- `apps/cli/internal/operator/handoff_test.go`
- `apps/cli/internal/operator/runner_backtest_test.go`
- `apps/cli/testdata/operator/headless_validation.md`
- `apps/cli/testdata/operator/backtest_matrix_seed_import.yaml`
- `apps/cli/testdata/operator/backtest_matrix_success.yaml`
- `apps/cli/testdata/operator/backtest_result_summary.yaml`
- `apps/cli/testdata/operator/expected/backtest_matrix_success.jsonl`
- `apps/cli/testdata/operator/expected/backtest_result_summary.jsonl`
- `services/worker/cmd/alt-worker/main.go`
- `services/worker/internal/scheduler/config.go`
- `services/worker/internal/scheduler/runner.go`

### SDD 기준

- S05: remote runner after scheduler tick should prove backtest readiness.
- Required evidence: backtest matrix/result summary, exit code 0.
- 이 target은 seeded import만으로 통과하면 안 된다. scheduler tick으로 채워진 데이터를 읽었다는 증거가 필요하다.

### 테스트 환경 규칙

- 테스트 환경: local + remote evidence.
- local 적용 profile: `operations-smoke`, `api-smoke`, `worker-smoke`.
- remote runner 실행 결과는 transcript 요약과 artifact 경로만 기록한다. secrets는 기록하지 않는다.

### 테스트 커버리지 공백

- `backtest_matrix_success` fixture는 pre-seed import 절차에 의존한다.
- `backtest_result_summary` fixture도 scheduler tick 이후 readiness를 별도 증명하지 않는다.
- handoff matrix에 scheduler-backed backtest readiness row가 없다.

### 심볼 참조

- 기존 backtest action 이름과 fixture 이름은 rename하지 않는다.
- scheduler-backed readiness scenario는 기존 seeded-import fixture와 분리한다.

### 분할 판단

- 이 task group은 `m-scheduled-market-data-refresh`다.
- archive 선행 `01_scheduled_runner`, `02_retry_backfill`은 완료됐다.
- active 선행 `04+03_refresh_status_cli`는 아직 완료되지 않았다. 구현 시작 전 `complete.log`와 `[refresh-status]` target 체크를 확인한다.
- 이 plan이 완료되면 roadmap target `backtest-readiness`를 체크할 수 있다.

### 범위 결정 근거

S05는 local fixture 추가만으로는 충분하지 않고 scheduler tick, remote runner, API/worker readiness, operator evidence를 함께 확인해야 한다. 따라서 G08 통합 plan으로 둔다.

### 빌드 등급

`cloud-G08`. remote runner evidence와 cross-domain smoke가 필요하고, scheduler-backed data가 backtest에 연결되는 운영 경로를 검증한다.

## 의존 관계 및 구현 순서

1. `agent-task/m-scheduled-market-data-refresh/04+03_refresh_status_cli/complete.log`와 roadmap `[refresh-status]` 체크를 확인한다.
2. scheduler tick 이후 status success를 조회하는 operator step을 readiness scenario 앞에 둔다.
3. import step 없이 backtest matrix/result summary를 실행하는 fixture를 만든다.
4. expected JSONL과 handoff matrix를 갱신한다.
5. local fake API 테스트로 scenario parsing/output을 고정한다.
6. remote runner에서 scheduler tick 뒤 scenario를 실행하고 exit code 0 evidence를 기록한다.
7. evidence PASS 후 `[backtest-readiness]` roadmap target을 체크한다.

## 구현 체크리스트

### [TEST-1] Scheduler-backed readiness scenario fixture 추가

- 문제: 기존 backtest fixtures는 seeded import 성공을 증명하지만 scheduler tick 이후 readiness를 직접 증명하지 않는다.
- 해결: `scheduled_backtest_readiness` 또는 동등한 fixture를 추가해 refresh status success 확인 뒤 backtest matrix/result summary를 실행한다.
- 파일 체크리스트:
  - `apps/cli/testdata/operator/scheduled_backtest_readiness.yaml`
  - `apps/cli/testdata/operator/expected/scheduled_backtest_readiness.jsonl`
  - `apps/cli/internal/operator/runner_backtest_test.go`
  - `apps/cli/internal/operator/handoff_test.go`
- 구현 기준:
  - scenario 안에 `import_daily_bars` 같은 seed import step을 넣지 않는다.
  - 첫 단계에서 선행 `refresh-status` action으로 scheduler tick 성공과 imported bar count를 확인한다.
  - 이어서 backtest matrix 또는 result summary를 실행하고 exit code 0을 검증한다.
  - JSONL에는 scheduler-backed data를 읽었다는 status evidence와 backtest result evidence가 모두 있어야 한다.
- 테스트 결정:
  - fake API 기반 expected output exact-match를 추가한다.
- 중간 검증:
  - `go test -count=1 ./apps/cli/internal/operator -run 'Test(ScheduledBacktestReadiness|HeadlessValidationHandoff|ExpectedOutputFixtures)'`

### [TEST-2] Handoff matrix와 운영 절차 갱신

- 문제: remote runner가 어떤 순서로 scheduler tick과 backtest readiness를 검증해야 하는지 handoff 문서에 없다.
- 해결: `headless_validation.md`에 scheduler-backed readiness row와 remote 절차를 추가한다.
- 파일 체크리스트:
  - `apps/cli/testdata/operator/headless_validation.md`
- 구현 기준:
  - 절차는 scheduler enabled worker/API를 띄우고 scheduler tick 완료를 확인한 뒤 readiness scenario를 실행하는 순서여야 한다.
  - endpoint/credential은 placeholder 또는 환경 변수로 표현한다.
  - PASS 기준은 refresh status success, backtest matrix/result summary ok, process exit code 0이다.
- 테스트 결정:
  - handoff validation test가 새 row와 fixture/expected output 존재를 확인한다.
- 중간 검증:
  - `go test -count=1 ./apps/cli/internal/operator -run 'TestHeadlessValidationHandoff|TestExpectedOutputFixtures'`

### [TEST-3] Remote runner evidence 수집

- 문제: S05는 remote runner after scheduler tick evidence를 요구한다.
- 해결: remote 환경에서 scheduler tick 뒤 readiness scenario를 실행하고 transcript/artifact 위치를 review 파일에 기록한다.
- 파일 체크리스트:
  - `CODE_REVIEW_cloud_G08.md`
- 구현 기준:
  - scheduler tick을 기다리거나 기존 manual trigger가 있다면 사용한다.
  - refresh status가 success이고 `last_success`, `next_run`, imported bar count가 채워진 것을 확인한다.
  - backtest matrix/result summary가 exit code 0으로 끝나야 한다.
  - remote 실행이 환경 문제로 불가하면 roadmap target을 체크하지 않고 USER_REVIEW 또는 blocker를 남긴다.
- 테스트 결정:
  - remote command transcript 또는 CI artifact 경로를 review 파일에 기록한다.
- 중간 검증:
  - `go run ./apps/cli/cmd/alt operator scenario run --file apps/cli/testdata/operator/scheduled_backtest_readiness.yaml --api-url "$ALT_OPERATOR_API_URL" --output jsonl`

### [TEST-4] Local smoke 검증과 roadmap target 반영

- 문제: operator fixture만 추가하고 broader smoke를 생략하면 runtime regression을 놓칠 수 있다.
- 해결: local smoke를 실행한 뒤 evidence PASS 조건에서만 roadmap target을 체크한다.
- 파일 체크리스트:
  - `agent-roadmap/phase/backtest-loop/milestones/scheduled-market-data-refresh.md`
  - `CODE_REVIEW_cloud_G08.md`
- 테스트 결정:
  - operations smoke와 관련 API/worker smoke를 실행한다.
- 중간 검증:
  - `go test ./apps/cli/internal/operator -run 'Test(ScheduledBacktestReadiness|HeadlessValidationHandoff|ExpectedOutputFixtures)'`
  - `go test ./apps/cli/...`
  - `go test ./services/api/...`
  - `go test ./services/worker/...`
  - `git diff -- agent-roadmap/phase/backtest-loop/milestones/scheduled-market-data-refresh.md`

- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 수정 파일 요약

- `apps/cli/testdata/operator/scheduled_backtest_readiness.yaml`: scheduler-backed readiness scenario 추가.
- `apps/cli/testdata/operator/expected/scheduled_backtest_readiness.jsonl`: expected JSONL 추가.
- `apps/cli/internal/operator/runner_backtest_test.go`: fixture/output coverage 추가.
- `apps/cli/internal/operator/handoff_test.go`: handoff matrix coverage 갱신.
- `apps/cli/testdata/operator/headless_validation.md`: remote runner 절차와 row 추가.
- `agent-roadmap/phase/backtest-loop/milestones/scheduled-market-data-refresh.md`: PASS 후 `[backtest-readiness]` 체크.
- `CODE_REVIEW_cloud_G08.md`: local/remote evidence 기록.

## 최종 검증

- `go test ./apps/cli/internal/operator -run 'Test(ScheduledBacktestReadiness|HeadlessValidationHandoff|ExpectedOutputFixtures)'`
- `go test ./apps/cli/...`
- `go test ./services/api/...`
- `go test ./services/worker/...`
- remote runner에서 `scheduled_backtest_readiness` scenario 실행, refresh status success와 backtest exit code 0 확인

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