<!-- task=m-korea-daily-data-foundation/03+01,02_data_check_smoke plan=0 tag=KIS_SMOKE -->

# Plan - Mock Data Check Smoke

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

이 subtask는 `01_provider_foundation`과 `02+01_import_storage_pipeline` 완료 후 시작한다. 구현 완료 전 active review stub의 구현 에이전트 소유 섹션을 채운다. 실제 KIS credential이나 1Password 준비를 요구하지 않는다.

## 배경

Milestone의 `data-check`는 normalized data가 backtest milestone에서 소비 가능한 형태로 조회되고 관련 검증이 통과해야 한다. 현재는 mock fixture 기반 흐름을 사람이 반복 실행할 수 있는 smoke 표면이 없다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 검증과 종료 처리를 소유한다.

## 분석 결과

### 읽은 파일

- `bin/dev`
- `bin/test`
- `bin/worker-storage-check`
- `apps/cli/cmd/alt/main.go`
- `services/worker/cmd/alt-worker/main.go`
- `services/worker/internal/jobs/builtin.go`
- `services/worker/testdata/providers/kis/*.json`
- `agent-task/m-korea-daily-data-foundation/01_provider_foundation/PLAN-cloud-G07.md`
- `agent-task/m-korea-daily-data-foundation/02+01_import_storage_pipeline/PLAN-cloud-G07.md`

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

- End-to-end mock import command: 기존 없음. CLI 또는 worker command test 필요.
- Human-runnable data check output: 기존 없음. stdout contract test 필요.
- Full worker package regression after import pipeline: 기존 `bin/test`는 있으나 feature-specific smoke 없음.

### 심볼 참조

none. 기존 `bin/test`와 storage check는 유지한다.

### 분할 판단

`03+01,02_data_check_smoke`는 directory name상 `01_provider_foundation`과 `02+01_import_storage_pipeline`에 의존한다. Smoke command는 실제 provider/import API가 완료된 뒤 작성해야 한다.

### 범위 결정 근거

실제 KIS network smoke, 1Password credential injection, Postgres Docker orchestration은 제외한다. 이 작업은 mock fixture를 읽어 normalized daily bar 조회 가능성을 보여주는 local command/test만 만든다.

### 빌드 등급

build=`cloud-G07`, review=`cloud-G07`. terminal-facing smoke output과 bin/CLI behavior가 포함된다.

## 의존 관계 및 구현 순서

1. `agent-task/m-korea-daily-data-foundation/01_provider_foundation/complete.log` 확인
2. `agent-task/m-korea-daily-data-foundation/02+01_import_storage_pipeline/complete.log` 확인
3. mock smoke command 구현
4. full verification 실행

## 구현 체크리스트

- [ ] 선행 `01_provider_foundation`과 `02+01_import_storage_pipeline`의 `complete.log`를 확인한다.
- [ ] mock fixture import와 normalized bar 조회를 실행하는 CLI 또는 worker command를 추가한다.
- [ ] command output이 instrument count, bar count, first/last timestamp를 안정적으로 출력하도록 테스트한다.
- [ ] `bin/test` 또는 focused worker command가 credential 없이 통과함을 검증한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [KIS_SMOKE-1] Mock Data Check Command

문제: [apps/cli main](/config/workspace/alt/apps/cli/cmd/alt/main.go:8)은 `version` 외에 운영자 command가 없고, worker import 결과를 재현 가능하게 확인할 표면도 없다.

해결 방법: 가장 작은 표면으로 `apps/cli` 또는 `services/worker/cmd`에 mock data check command를 추가한다. command는 KIS fixture를 import pipeline에 넣고 in-memory store에서 bars를 조회한 뒤 stable summary를 출력한다.

수정 파일 및 체크리스트:

- [ ] `apps/cli/cmd/alt/main.go` 또는 새 `services/worker/cmd/alt-worker-data-check/main.go` 추가/수정
- [ ] command test 추가

테스트 작성: stdout에 `instrument_count=1`, `bar_count=2`, `first=2024-05-27`, `last=2024-05-28`이 있는지 확인한다.

중간 검증:

```bash
cd apps/cli && go test -count=1 ./...
```

### [KIS_SMOKE-2] Whole Worker Regression

문제: mock provider/import/smoke가 여러 package를 가로지른 뒤 worker 전체 regression 명령이 명시되어 있지 않다.

해결 방법: focused tests와 `bin/test`를 모두 실행한다. sqlc generated drift는 storage query 변경이 있을 때만 `bin/worker-storage-check`를 추가 실행한다.

수정 파일 및 체크리스트:

- [ ] smoke command 구현 후 `bin/test` 통과 확인
- [ ] storage query/migration 변경이 있었다면 `bin/worker-storage-check` 실행

테스트 작성: 별도 새 테스트는 KIS_SMOKE-1에 포함한다.

중간 검증:

```bash
bin/test
```

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/cli/cmd/alt/main.go` 또는 `services/worker/cmd/alt-worker-data-check/main.go` | KIS_SMOKE-1 |
| command test file | KIS_SMOKE-1 |
| `bin/*` only if an entrypoint is needed | KIS_SMOKE-2 |

## 최종 검증

```bash
test -f agent-task/m-korea-daily-data-foundation/01_provider_foundation/complete.log
test -f agent-task/m-korea-daily-data-foundation/02+01_import_storage_pipeline/complete.log
bin/test
```

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