# Step 1: Reference CSV Adapters ## 읽어야 할 파일 - `/AGENTS.md` - `/docs/PRD.md` - `/docs/ARCHITECTURE.md` - `/docs/ADR.md` - `/docs/superpowers/specs/2026-07-29-abaqus-assembly-reference-design.md` - `/include/fesa/validation/comparison.hpp` - `/reference/cantilever beam/cantilever beam displacements.csv` - `/reference/cantilever beam/cantilever beam reactions.csv` ## 작업 네 물리량의 명시적 CSV schema를 읽어 canonical reference row로 변환한다. ```cpp struct ReferenceRow final { ReferenceQuantity quantity; ResultPosition position; std::vector values; }; struct ReferenceCsvReadResult final { std::vector rows; std::vector diagnostics; }; [[nodiscard]] ReferenceCsvReadResult read_reference_csv( ReferenceQuantity, const std::filesystem::path&, std::string_view single_instance_name); ``` - displacement/reaction은 제공된 whitespace 포함 Abaqus header를 읽는다. - internal force schema: `Part Instance Name, Element Label, Node Label, SF-SF1..SF-SF3, SM-SM1..SM-SM3` - stress schema: `Part Instance Name, Element Label, Node Label, Sxx` - 단일 Instance에서는 Instance 열 생략을 허용하고 request 이름으로 보완한다. - `tests/fixtures/reference`에 synthetic internalforce/stress CSV를 먼저 만들고, 6개 내력 component와 centroid stress row를 실패 테스트로 고정한다. ## Acceptance Criteria ```powershell cmake --build --preset windows-debug ctest --preset windows-debug -R "ReferenceCsv|InternalForceCsv|StressCsv" --output-on-failure ctest --preset windows-debug --output-on-failure ``` ## 검증 절차 1. four-schema parser test 실패를 확인한다. 2. header/value trim과 선택적 UTF-8 BOM만 허용한다. 3. missing column, duplicate row, invalid number를 진단한다. 4. 전체 테스트와 index를 갱신한다. ## 금지사항 - metadata.json을 요구하지 마라. 이유: 승인된 reference 계약과 다르다. - unknown column으로 필수 column 누락을 숨기지 마라. 이유: 잘못된 비교를 만든다. - 내력/응력 파일이 없다는 이유로 adapter 구현을 생략하지 마라. 이유: 필수 루틴이다.