# 요구조건 문서 작성 가이드

이 디렉터리는 Requirement Agent가 작성하거나 제안한 기능별 요구조건 문서를 보관하는 위치다.

기본 파일명은 `docs/requirements/<feature-id>.md` 형식을 사용한다. 각 문서는 구현 전에 작성되며, Formulation Agent, I/O Definition Agent, Reference Model Agent, Implementation Planning Agent가 이어받을 수 있는 검증 가능한 baseline이어야 한다.

## Requirement Agent 역할

Requirement Agent는 솔버 기능 요청을 검증 가능한 요구조건으로 바꾼다.

수행한다:
- 기능 범위, 제외 범위, 입력, 출력, 제약조건을 정의한다.
- 해석 타입, 대상 요소, 자유도, 재료 모델, 경계조건, 하중 조건을 명확히 한다.
- 절점 변위, 반력, 요소 내력, 응력 등 검증 물리량을 정한다.
- tolerance와 reference artifact 요구사항을 기록한다.
- Requirement Verification Matrix를 작성한다.

수행하지 않는다:
- C++ 코드를 구현하지 않는다.
- 유한요소 정식화를 확정하지 않는다.
- C++ API나 파일 구조를 설계하지 않는다.
- Abaqus, Nastran 또는 레퍼런스 솔버를 직접 실행하지 않는다.
- Abaqus reference CSV 파일을 생성하거나 수정하지 않는다.
- 기능 완료 여부를 승인하지 않는다.

## 문서 템플릿

```markdown
# <feature title> Requirements

## Metadata
- feature_id: <feature-id>
- title: <title>
- status: draft | needs-user-decision | approved
- owner_agent: requirement-agent
- date: <YYYY-MM-DD>

## Purpose
<기능 목적과 사용자/개발자 관점의 기대 동작>

## In Scope
- <포함 범위>

## Out Of Scope
- <제외 범위>

## Analysis Definition
- analysis_type: linear static | nonlinear static | modal | other
- elements: <대상 요소>
- dofs: <자유도>
- material_model: <재료 모델>
- boundary_conditions: <경계조건>
- loads: <하중 조건>
- coordinate_system: <좌표계>
- units: <단위계>

## Input Requirements
- <입력 요구조건>

## Output Requirements
- <출력 요구조건>

## Verification Quantities
- nodal_displacement: required | not-applicable
- reaction: required | not-applicable
- element_internal_force: required | not-applicable
- stress: required | not-applicable
- strain: required | not-applicable
- energy_or_residual: required | not-applicable

## Tolerance Policy
- absolute_tolerance: <value or TBD>
- relative_tolerance: <value or TBD>
- norm_based_tolerance: <value or TBD>

## Reference Case Requirements

- input_path: <exact existing `.inp` path or N/A>
- required_csv_paths: <only blocking/warning quantity CSV paths or N/A>
- blocking_quantities: <components or N/A>
- warning_only_quantities: <components or N/A>
- hdf5_projection: <dataset or N/A>
- source_id_component_matching: <rule or N/A>
- row_precheck: missing/extra/duplicate/nonfinite fail before tolerance
- tolerance: <approved formula or N/A>

Canonical naming, README, metadata, provenance, duplicated units/coordinates/step-frame fields,
CSV schema versions와 비교하지 않는 quantity CSV는 기본 요구조건이 아니다.

## Requirement Verification Matrix

| id | statement | category | rationale | source | priority | verification_method | acceptance_criteria | tolerance | downstream_agents | status |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| FESA-REQ-<FEATURE>-001 | The FESA solver shall ... | functional | ... | user | must | reference-comparison | ... | ... | Reference Model Agent; Implementation Planning Agent | draft |

## Open Questions
- <미확정 값 또는 사용자 결정 필요 사항>

## Downstream Handoff

### Research Agent
- <조사할 이론, 논문, benchmark, 표준>

### Formulation Agent
- <정식화 단계에 넘길 해석 타입, 요소, 재료, 자유도, 출력 물리량 계약>

### I/O Definition Agent
- <입력/출력 schema 요구조건>

### Reference Model Agent
- <exact input/required CSV paths, blocking/warning quantities, matching, tolerance>

### Implementation Planning Agent
- <먼저 작성할 테스트와 acceptance criteria>
```

## 품질 기준

- 모든 `must` 요구조건은 검증 방법과 acceptance criteria를 가져야 한다.
- 모든 수치 요구조건은 단위, 좌표계, tolerance 또는 `TBD with owner`를 가져야 한다.
- reference 비교가 필요한 요구조건은 필요한 CSV artifact를 명시해야 한다.
- "빠르게", "정확하게", "Abaqus처럼" 같은 문장은 검증 가능한 기준으로 바꾸거나 open question으로 남겨야 한다.
- 구현 방법, 정식화 세부식, C++ API는 이 문서에서 확정하지 않는다.
