# Step 26: Abaqus B33 Reference Verification

## 담당 역할과 필수 스킬

- 담당 역할: `reference-verification-agent`
- 필수 스킬: `fesa-reference-comparison`
- `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` 순서를 지켜라.

## 읽어야 할 파일

- `/AGENTS.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/reference-verifications/README.md`
- `/docs/build-test-reports/linear-static-3d-euler-beam.md`
- `/docs/reference-models/linear-static-3d-euler-beam-reference-models.md`
- `/docs/io-definitions/linear-static-3d-euler-beam-io.md`
- `/docs/requirements/linear-static-3d-euler-beam.md`
- `/docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`
- `/reference/cantilever beam/cantilever beam.inp`
- `/reference/cantilever beam/cantilever beam displacements.csv`
- `/reference/cantilever beam/cantilever beam reactions.csv`
- `/reference/cantilever beam/cantilever beam elemental forces.csv`
- Step 24가 생성한 reference comparison test/command 계약과 build-directory result/metrics

## 작업

Build/Test report status가 `pass-for-reference-verification`인지 먼저 확인한다. 통과했다면
승인 input으로 solver output을 재생성하고, test-only comparison utility가 기록한 raw
normalized rows/metrics를 독립 검토해
`docs/reference-verifications/linear-static-3d-euler-beam-reference-verification.md`를 작성하라.

Artifact check:

- exact legacy 네 파일 존재, input `TYPE=B33`, expected CAE CSV headers, unique row keys,
  finite values를 검사한다.
- `metadata.json` 부재는 프로젝트 전역 정책에 따라 허용한다. 이 bundle의 `README.md`와
  stress CSV 부재는 승인된 legacy 예외이므로 차단하지 않는다. Contract에서
  provenance/units/schema/stress N/A를 확인한다.
- generated HDF5 schema/version/units/coordinate/step-frame/source identity를 검사한다.

Comparison:

- displacement CSV `U-U1/U-U2/U-U3/UR-UR1/UR-UR2/UR-UR3`, reaction CSV
  `RF-RF1/RF-RF2/RF-RF3/RM-RM1/RM-RM2/RM-RM3`, section-resultant CSV
  `SF-SF1/SM-SM1/SM-SM2/SM-SM3`을 canonical component로 normalize한 뒤 exact
  identity/component mapping으로 비교한다.
- CSV increment 1/time 1.0을 `(Step-1, frame 0)`으로 normalize한다.
- interior endpoint consistency를 먼저 검사하고 평균으로 숨기지 않는다.
- 같은 model/step/frame/quantity/component의 read-only reference rows에서만
  `reference_scale=max(abs(reference_value_i))`를 계산한다.
- 모든 row에 `absolute_floor + 1e-6*reference_scale`을 적용한다. SI displacement/rotation
  floor `1e-9`, force/moment floor `1e-3`; scale zero면 floor만 적용한다.
- Missing/extra/nonfinite/schema/identity mismatch는 tolerance 전에 fail한다.
- max absolute error, component-scale normalized error, RMS, norm, worst row/component를 기록한다.
- Stress reference comparison은 N/A라고 명시하고 HDF5 stress schema/unit test evidence를 연결한다.

모든 비교 통과 시 Metadata status는 `pass-for-physics-evaluation`이다. No-Change Assertion에
source/test/CMake/reference/tolerance가 모두 unchanged임을 기록한다.

## Acceptance Criteria

```powershell
if (-not (Select-String -LiteralPath 'docs/build-test-reports/linear-static-3d-euler-beam.md' `
    -SimpleMatch 'status: `pass-for-reference-verification`' -Quiet)) {
  throw 'Build/test gate is not passing'
}
ctest --test-dir .harness/build -C Debug -R B33ReferenceComparison -V --output-on-failure
$metricsPath = '.harness/build/reference/cantilever-beam-b33/comparison.json'
if (-not (Test-Path $metricsPath)) { throw 'Missing comparison metrics' }
$metrics = Get-Content -Raw $metricsPath | ConvertFrom-Json
if ($metrics.passed -ne $true) { throw "Reference comparison failed: passed=$($metrics.passed)" }
git diff --exit-code -- reference/
```

```powershell
$path = 'docs/reference-verifications/linear-static-3d-euler-beam-reference-verification.md'
if (-not (Test-Path $path)) { throw "Missing $path" }
$required = @('status: `pass-for-physics-evaluation`', '## Artifact Inventory',
  '## Comparison Contract', '## Quantity Results', '## No-Change Assertion',
  'cantilever-beam-b33', 'absolute_floor + 1e-6 * reference_scale', 'stress', 'N/A')
foreach ($text in $required) {
  if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
    throw "Missing reference verification evidence: $text"
  }
}
git diff --check -- $path
```

## 검증 절차

1. Artifact check를 comparison보다 먼저 완료한다.
2. B33ReferenceComparison을 fresh 실행하고 comparison JSON과 HDF5를 직접 확인한다.
3. 모든 row/metric/tolerance가 통과한 경우에만 report와 Step 26을 pass/completed로 갱신한다.
4. 실패는 정해진 classification과 handoff를 report에 기록하고 Step 26을 `error`로 둔다.
   사용자/외부 artifact 조치가 필수인 경우만 `blocked`로 둔다.

## 금지사항

- source, tests, CMake, upstream contract를 수정하지 마라. 이유: independent comparison gate다.
- FESA 결과나 reference value로 scale/tolerance를 조정하지 마라. 이유: acceptance를 오염시킨다.
- row를 zero-clamp, 삭제, 평균 처리하지 마라. 이유: mismatch를 숨긴다.
- reference artifact를 생성·수정·rename하지 마라. 이유: read-only baseline이다.
- Abaqus를 실행하지 마라. 이유: 저장된 CSV만 authoritative reference다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
