# Step 3: Phase 1 Scale Benchmark

## 읽어야 할 파일

- `/AGENTS.md`
- `/docs/PRD.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/RELEASE_CHECKLIST.md`
- `/include/fesa/analysis/run_solver.hpp`
- `/tests/performance/assembly_benchmark.cpp`

## 작업

약 100,000 DOF의 deterministic Beam chain 모델로 메모리와 시간을 측정하는
`tests/performance/phase1_scale_benchmark.cpp`를 만든다.

- model generation, parsing/Domain build, assembly, PARDISO solve, recovery, HDF5 write
  시간을 구분해 출력한다.
- peak working set 또는 Windows에서 재현 가능한 memory metric을 기록한다.
- benchmark는 finite result, equilibrium, expected DOF count와 정상 종료만 assertion한다.
- 임의 성능 기준이나 speedup을 pass 조건으로 만들지 않는다.

## Acceptance Criteria

```powershell
cmake --build --preset windows-release
.\out\build\windows-release\Release\fesa_phase1_scale_benchmark.exe
ctest --preset windows-release --output-on-failure
```

출력에 모델 크기, 각 stage 시간, memory metric, thread 설정, solver 설정이 포함되어야
한다.

## 검증 절차

1. 작은 model에서 benchmark correctness test를 먼저 실패시킨다.
2. 동일 generator로 목표 크기를 실행한다.
3. 측정값과 환경을 release checklist에 기록한다.
4. index summary에 결과 위치와 실제 DOF count를 기록한다.

## 금지사항

- benchmark를 unit test timeout에 묶지 마라. 이유: 머신 성능에 따라 달라진다.
- 결과 정확성 검사를 생략하지 마라. 이유: 빠른 오답은 성능 증거가 아니다.
- 실제 측정 없이 목표 시간을 만들지 마라. 이유: 요구사항에 근거가 없다.
