# Milestone: Operator Headless Workflow Validation

## 위치

- Roadmap: `agent-roadmap/ROADMAP.md`
- Phase: `agent-roadmap/phase/operator-surface/PHASE.md`

## 목표

Flutter 화면 없이 ALT 운영 흐름을 terminal/YAML/log/test fixture 기반으로 먼저 검증한다. market data와 backtest 조회/실행 경로가 화면 없이도 구성, 실행, 결과 확인이 가능해진 뒤에만 operator dashboard 화면 구현 후보로 넘긴다.

## 상태

[완료]

## 구현 잠금

- 상태: 해제
- 결정 필요: 없음

## 범위

- YAML 또는 동등한 파일 기반 operator scenario 정의
- CLI/terminal entrypoint에서 scenario 실행 또는 조회
- market data status/import 결과 확인
- backtest list/detail/result/start 요청 결과 확인
- unavailable/error/disconnected 결과의 machine-readable 또는 grep 가능한 출력
- 화면 구현 전 검증 evidence 산출 방식
- `api_connection_smoke`, `market_data_status_query`, `backtest_run_request`, `backtest_run_polling`, `backtest_result_summary`, `invalid_request_matrix` 시나리오의 command/input/output/exit code 기준 확정

## 기능

### Epic: [headless-op] Headless operator workflow validation

운영 화면을 만들기 전에 같은 API/worker 경계를 화면 없이 검증한다.

- [x] [scenario-format] operator scenario를 YAML 또는 동등한 파일 형식으로 표현한다. 검증: 예시 scenario가 parser 또는 dry-run 검증을 통과한다.
- [x] [terminal-run] terminal에서 scenario를 실행하거나 대표 조회를 수행할 수 있다. 검증: CLI 또는 script가 exit code와 요약 출력을 남긴다.
- [x] [market-check] market data status/import 관련 결과를 화면 없이 확인할 수 있다. 검증: fixture 또는 local smoke가 상태 출력을 확인한다.
- [x] [backtest-check] backtest list/detail/result/start 관련 결과를 화면 없이 확인할 수 있다. 검증: fixture 또는 local smoke가 성공/실패 결과를 확인한다.
- [x] [error-output] unavailable/error/disconnected 상태가 화면 없이도 판별 가능한 출력으로 남는다. 검증: typed error 또는 상태 코드 출력 테스트가 통과한다.
- [x] [handoff] Flutter 화면 MVP로 넘길 수 있는 검증 evidence와 남은 wireframe 의존성을 정리한다.

## 완료 리뷰

- 상태: 승인됨
- 요청일: 2026-06-01
- 완료 근거: `apps/cli/internal/operator/scenario.go`, `apps/cli/internal/cli/cli.go`, `apps/cli/internal/operator/runner.go`가 YAML scenario validate/run과 text/jsonl 출력을 제공한다.
- 완료 근거: `apps/cli/testdata/operator/*.yaml`, `apps/cli/testdata/operator/expected/*.jsonl`, `apps/cli/testdata/operator/headless_validation.md`가 market data, backtest, invalid request matrix의 command/input/output/exit code evidence를 정리한다.
- 완료 근거: 원격 ALT checkout에서 `go test ./apps/cli/...`가 통과했다.
- 리뷰 필요:
  - [x] 사용자가 완료 결과를 확인했다
  - [x] archive 이동을 승인했다
- 리뷰 코멘트: 2026-06-01 사용자 요청으로 완료 승인 및 archive 이동을 수행했다. `bin/test` 전체 smoke는 원격 checkout에서 `protoc-gen-go` 미설치로 차단되었으며, 필요하면 원격 toolchain 보강 후 재실행한다.

## 범위 제외

- Flutter 실화면 구현
- dashboard layout, chart, form visual design 확정
- push notification
- production 운영 자동화

## 작업 컨텍스트

- 관련 경로: `apps/cli/`, `bin/`, `services/api/`, `services/worker/`, `packages/contracts/`
- 표준선(선택): 화면 구현보다 CLI/YAML/headless smoke를 먼저 만들고, 결과는 exit code와 machine-readable 또는 grep 가능한 출력으로 남긴다.
- 선행 작업: Flutter Operator Console UX Plan
- 후속 작업: Flutter Operator Console MVP
- 확인 필요: 없음

## UX Plan handoff 기준

`Flutter Operator Console UX Plan`에서 넘기는 headless validation 후보는 다음 실행 단위로 구체화한다.

| Scenario | 입력 | 확인 결과 |
|----------|------|-----------|
| `api_connection_smoke` | API socket host/path와 optional reconnect 설정 | handshake/capability, disconnected/reconnect 실패, exit code |
| `market_data_status_query` | symbol, date range, provider/capability option | availability, empty, unavailable 상태와 grep 가능한 status key |
| `backtest_run_request` | strategy, symbol universe, date range, initial capital | validation success/failure, run id, typed error key |
| `backtest_run_polling` | run id, polling timeout | queued/running/completed/failed 전이와 실패 사유 |
| `backtest_result_summary` | completed run id | summary metrics, empty result, missing run id error |
| `invalid_request_matrix` | 필수 입력 누락 또는 잘못된 symbol/date/capital/capability | validation error, unavailable/error 구분, non-zero exit code |

각 scenario는 command, YAML 또는 동등 fixture, expected terminal/log output, exit code, 확인할 protobuf 또는 view-model field를 evidence로 남긴다.
