# task-1772.3 완료 보고서 — 시나리오 검증 시스템 Phase 3: 운영 안정화 + 미해결 이슈

## SCQA

**S**: Phase 2 (task-1768.1) 완료로 scenario_runner.py에 Playwright E2E 지원, setup_auth.py, 시나리오 시드 15개가 운영 중이다. 미해결 이슈 2건(storageState TTL 자동 갱신, Playwright 순차 실행)과 Phase 3 항목(scenario_generator, 축적 관리)이 잔여 과제였다.

**C**: storageState 만료 시 경고만 출력하여 수동 `setup_auth.py --refresh` 실행이 필요했다. CI/무인 환경에서 1시간 후 Playwright 테스트가 자동 실패하는 운영 리스크가 존재했다.

**Q**: 미해결 2건 해소 + LLM 시나리오 생성 + 축적 관리를 통합하여 무인 운영 안정화할 수 있는가?

**A**: 완료. storageState TTL 만료 시 `_auto_refresh_storage_state()` 함수가 `setup_auth.py --refresh`를 subprocess로 자동 호출한다. Playwright 순차 실행, scenario_generator, 축적 관리는 Phase 2 이후 이미 구현 완료 상태로 검증만 수행. pytest 35건 전부 통과(62초), 검증 시나리오 6/6 충족.

---

## 산출물

### 수정 파일
- `/home/jay/workspace/teams/shared/qc/scenario_runner.py`
- `/home/jay/workspace/teams/shared/qc/tests/test_scenario_runner.py`

---

## 구현 상세

### 미해결 #1: storageState TTL 자동 갱신 (해결)
- `scenario_runner.py`에 `_auto_refresh_storage_state(storage_state_path)` 함수 추가 (라인 233-245)
- `subprocess.run(["python3", setup_auth_path, "--refresh", "--output", path], timeout=60)` 호출
- 성공 시 `returncode == 0 → True`, 예외/실패 시 `False`
- `run_scenarios()` 내 TTL 체크 블록(라인 347-359)에서 자동 갱신 호출 → 성공/실패 메시지 출력
- 실패해도 playwright 시나리오는 계속 실행 (graceful degradation)

### 미해결 #2: Playwright 순차 실행 분리 (이미 해결)
- Phase 2 이후 `run_scenarios()`에서 type별 분류 구현 완료
- `playwright_scenarios` → 순차 for 루프 (라인 370-378)
- `parallel_scenarios` → `ThreadPoolExecutor(max_workers=5)` 병렬 (라인 362-368)

### 항목 3: LLM 시나리오 초안 생성 (이미 구현)
- `scenario_generator.py`: 템플릿 기반 + LLM 프롬프트 생성기
- CLI: `--task-file`, `--level`, `--project`, `--task-id`, `--output`
- Lv.3: 15~30개, Lv.4: 30~50개, 모두 `automatable: false`

### 항목 4: 시나리오 축적 관리 (이미 구현)
- `scenarios/` 디렉토리에 `.gitkeep` 존재
- `scenario_runner.py --stats`: 프로젝트별 카운트 + 중복 ID 감지
- 현재 통계: insuwiki 12개, dashboard 6개, total 18개, 중복 0건

---

## 테스트 결과

### pytest (35건 전부 통과, 62초)
```
test_scenario_runner.py — 21건 PASSED
  기존 19건 + 신규 2건:
    test_auto_refresh_called_when_ttl_expired PASSED
    test_auto_refresh_failure_logs_warning PASSED
test_setup_auth.py — 6건 PASSED
test_scenario_generator.py — 8건 PASSED
```

### 검증 시나리오 (6/6 충족)
1. ✅ storageState 55분 경과 → 자동 갱신 호출 확인 (test_auto_refresh_called_when_ttl_expired)
2. ✅ playwright 3개 + subprocess 5개 → 분리 실행 확인 (test_playwright_runs_sequentially)
3. ✅ scenario_generator --level 3 → 15개 YAML 생성 확인
4. ✅ 생성 YAML automatable: false 전수 확인
5. ✅ --stats → insuwiki: 12, dashboard: 6, total: 18, duplicates: 0
6. ✅ 전체 실행 시간 62초 (5분 이내)

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **storageState TTL 만료 시 자동 갱신 미호출** — `_auto_refresh_storage_state()` 함수 추가하여 subprocess로 setup_auth.py --refresh 자동 호출
   - 수정: `scenario_runner.py:233-245` (신규 함수), `:347-359` (호출 블록 교체)
2. **자동 갱신 실패 시 silent failure 가능성** — 실패 시 경고 로그 출력 + playwright 시나리오 계속 실행하도록 graceful degradation 구현
   - 수정: `scenario_runner.py:356-357` (실패 메시지 출력)
3. **기존 TTL 경고 테스트와 신규 구현 호환성** — 기존 `test_ttl_check_warning_logged_when_expired` 테스트가 새 메시지에서도 "TTL" 또는 "storageState" 키워드를 포함하여 통과 확인
   - 검증: 35건 전체 통과로 회귀 없음 확인

---

## 모델 사용 기록
- 토르(백엔드) / 작업: TTL 자동 갱신 TDD 구현 (테스트 2건 + 함수 1개 + run_scenarios 수정) / 모델: sonnet

## 머지 판단
- **머지 필요**: No (시스템 작업, worktree 미사용)
- **브랜치**: N/A
- **워크트리 경로**: N/A
- **머지 의견**: shared/qc/ 디렉토리에 직접 반영 완료
