# Step 3: CLI Pipeline Integration

## 읽어야 할 파일

- `/AGENTS.md`
- `/docs/PRD.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/include/fesa/io/abaqus/parser.hpp`
- `/include/fesa/io/abaqus/semantic_mapper.hpp`
- `/include/fesa/analysis/linear_static_analysis.hpp`
- `/include/fesa/io/hdf5/writer.hpp`
- `/src/fesa/cli/main.cpp`

## 작업

flat minimal fixture를 입력부터 HDF5까지 실행하는 public application 경로를 연결한다.

```cpp
struct AnalysisRequest final {
    std::filesystem::path input_path;
    std::filesystem::path output_path;
};
[[nodiscard]] AnalysisRunResult run_solver(const AnalysisRequest&);
```

CLI 계약:

```text
fesa solve <model.inp> --output <results.h5>
fesa --version
```

- 먼저 `MinimalCantileverPipeline` 통합 테스트를 작성한다.
- test는 `run_solver` 또는 CLI와 public HDF5 reader만 사용한다.
- 성공 파일의 ID, finite displacement, reaction/equilibrium diagnostic과 schema path,
  실패 입력의 nonzero exit 및 source diagnostic을 검증한다.

## Acceptance Criteria

```powershell
cmake --build --preset windows-debug
ctest --preset windows-debug -R MinimalCantileverPipeline --output-on-failure
.\out\build\windows-debug\Debug\fesa.exe solve tests\fixtures\abaqus\minimal_cantilever.inp --output out\minimal-cantilever.h5
h5ls -r out\minimal-cantilever.h5
ctest --preset windows-debug --output-on-failure
```

## 검증 절차

1. end-to-end test 실패를 확인한다.
2. parser→Domain→analysis→writer만 조율한다.
3. command와 public reader로 산출물을 재검증한다.
4. 이 milestone을 수치 자격 완료로 표시하지 말고 index를 갱신한다.

## 금지사항

- hierarchical sample의 전체 keyword를 우회 처리하지 마라. 이유: 다음 input phase다.
- fake stiffness/result를 쓰지 마라. 이유: 실제 pipeline 검증을 무효화한다.
- CLI에 solver 내부 구현을 넣지 마라. 이유: core/library 재사용성을 훼손한다.
