# scenario_runner.py — 시나리오 YAML 실행기 + qc_verify.py 통합

## Lv.2 작업

## 목적
시나리오 YAML 파일을 읽어 자동 실행하고, 결과를 qc_verify.py 게이트에 통합.

## 구현

### 1. scenario_runner.py
**파일 위치**: `/home/jay/workspace/teams/shared/qc/scenario_runner.py`

**입력**:
```bash
python3 scenario_runner.py --scenarios-dir scenarios/insuwiki --impact impact.json --output result.json
```

**YAML 스키마**:
```yaml
- id: SC-001
  category: data-flow
  target: ["server.py:5637", "knowledge_extractor_v2.py:890"]
  type: subprocess  # curl | pytest | subprocess
  steps:
    - action: "curl -s -X POST http://localhost:8000/api/wiki/refine/start -d '{\"filePath\":\"/tmp/test.txt\",\"selectedMonth\":\"2026-03\"}'"
      expect_contains: "--month 2026-03"
      expect_status: 200
    - action: "ps aux | grep kakao_knowledge"
      expect_contains: "--month 2026-03"
  priority: must  # must | should | could
  automatable: true
```

**type별 러너**:
- `curl`: HTTP 요청 → status code + body 검증
- `subprocess`: 쉘 명령 실행 → stdout/stderr에 expect 문자열 포함 검증
- `pytest`: pytest 파일 경로 실행 → exit code 검증

**실행 흐름**:
1. impact.json 로드 → affected 목록 추출
2. scenarios/*.yaml 로드 → target이 affected에 매칭되는 시나리오 필터
3. 필터된 시나리오를 type별로 분류
4. ThreadPoolExecutor(max_workers=5)로 병렬 실행
5. 결과 집계 → result.json 저장

**결과 (result.json)**:
```json
{
  "total": 10,
  "passed": 8,
  "failed": 1,
  "skipped": 1,
  "duration_seconds": 45,
  "failures": [
    {"id": "SC-003", "reason": "expected '--month 2026-03' not found in output"}
  ],
  "gate": "FAIL"  # must 1개라도 FAIL → FAIL
}
```

### 2. qc_verify.py 통합

**CHECK_ORDER에 추가**:
```python
CHECK_ORDER = [
    "file_check", "data_integrity", "test_runner", "tdd_check",
    "pyright_check", "style_check", "scope_check", "critical_gap",
    "spec_compliance", "duplicate_check", "claude_md_check",
    "scenario_gate",  # ← 추가
]
```

**run_check()에 scenario_gate 분기 추가**:
```python
elif name == "scenario_gate":
    from qc import scenario_runner
    return scenario_runner.verify(
        task_id=task_id,
        scenarios_dir=scenarios_dir,
        impact_file=impact_file,
        check_files=file_paths,
    )
```

**--scenarios-dir 파라미터 추가** (parse_args):
```python
parser.add_argument("--scenarios-dir", default="", help="시나리오 YAML 디렉토리")
```

**빈 시나리오 정책**:
- 시나리오 0건 + Lv.3 이상 → FAIL ("시나리오 없음: Lv.3+ 작업은 시나리오 필수")
- 시나리오 0건 + Lv.1-2 → SKIP (허용)

### 3. 초기 시나리오 시드

`/home/jay/workspace/teams/shared/qc/scenarios/insuwiki/refine.yaml`:
```yaml
- id: SC-REFINE-001
  category: data-flow
  target: ["server.py"]
  type: subprocess
  steps:
    - action: "grep -n 'cmd.extend.*--month' /home/jay/workspace/dashboard/server.py"
      expect_contains: "--month"
  priority: must
  automatable: true
  description: "server.py에 --month 전달 코드 존재 확인"

- id: SC-REFINE-002
  category: data-flow
  target: ["knowledge_extractor_v2.py"]
  type: subprocess
  steps:
    - action: "grep -n 'month' /home/jay/projects/insuwiki/scripts/kakao_knowledge/knowledge_extractor_v2.py"
      expect_contains: "month"
  priority: must
  automatable: true
  description: "knowledge_extractor_v2.py에 month 파라미터 존재 확인"
```

`/home/jay/workspace/teams/shared/qc/scenarios/dashboard/polling.yaml`:
```yaml
- id: SC-POLL-001
  category: integration
  target: ["InsuWikiView.js"]
  type: subprocess
  steps:
    - action: "grep -n 'setInterval.*pollRefineStatus' /home/jay/workspace/dashboard/components/InsuWikiView.js"
      expect_contains: "setInterval"
  priority: must
  automatable: true
  description: "polling이 모든 상태에서 동작하는 코드 존재 확인"
```

## 검증 시나리오
1. `scenario_runner.py --scenarios-dir scenarios/insuwiki --output result.json` → result.json에 gate: "PASS" 확인
2. must 시나리오 1개를 의도적으로 FAIL 설정 → gate: "FAIL" 확인
3. 시나리오 0건 + --level 3 → FAIL 반환 확인
4. 시나리오 0건 + --level 1 → SKIP 반환 확인
5. qc_verify.py --gate --task-id test-001에서 scenario_gate가 CHECK_ORDER에 포함되어 실행되는지 확인
6. 실행 시간 4분 이내 확인

## 참조
- 3문서: `/home/jay/workspace/memory/plans/scenario-verification/`
- 미팅 기록: `/home/jay/workspace/memory/meetings/2026-04-13-scenario-verification-system.md`
- 기존 qc_verify.py: `/home/jay/workspace/teams/shared/qc_verify.py` (624줄, 구조 참조)
- 기존 verifier 예시: `/home/jay/workspace/teams/dev4/qc/verifiers/` (패턴 참조)

## 보고서
`/home/jay/workspace/memory/reports/task-{TASK_ID}.md`