From 2c91462a4525428b4685f515abeae1b4ab702555 Mon Sep 17 00:00:00 2001 From: "KOKO\\Mimi" Date: Tue, 1 Sep 2026 17:43:57 +0900 Subject: [PATCH] feat(shell-surface-pressure-load): step 7 - verify-and-report-pressure-feature --- .../shell-surface-pressure-load/build-test.md | 84 ++++++++++++ .../implementation-report.md | 116 +++++++++++++++++ .../reference-comparison.md | 122 ++++++++++++++++++ 3 files changed, 322 insertions(+) create mode 100644 docs/shell-surface-pressure-load/build-test.md create mode 100644 docs/shell-surface-pressure-load/implementation-report.md create mode 100644 docs/shell-surface-pressure-load/reference-comparison.md diff --git a/docs/shell-surface-pressure-load/build-test.md b/docs/shell-surface-pressure-load/build-test.md new file mode 100644 index 0000000..55d35ef --- /dev/null +++ b/docs/shell-surface-pressure-load/build-test.md @@ -0,0 +1,84 @@ +# Shell Surface Pressure Load — 빌드·테스트 보고서 + +## 메타데이터 + +- feature_id: `shell-surface-pressure-load` +- owner_agent: `implementation-agent` +- 상태: agent 소유 focused 검증 통과 +- `.harness/config.json`은 없었으므로 Step 7이 지정한 direct CMake 명령을 사용했다. +- 선택 환경: root CMake project, Visual Studio 18 2026 generator, x64, Debug, + C++17, MSVC 19.51.36252.0 (tool path 14.51.36231), MSBuild 18.8.2. +- 의존성: GoogleTest `C:/git/googletest`, MKL 2026.1, TBB 2023.1, HDF5 2.1.1. + +## RED 사전검사와 이전 TDD 증거 + +시작 시 `implementation-report.md`, `build-test.md`, +`reference-comparison.md`가 모두 없었다. 이는 Step 7이 요구한 +evidence-state RED다. Steps 1–6의 실행 기록을 감사하여 각 production/test/CMake +변경마다 expected RED와 GREEN/focused VERIFY가 있음을 확인했다. Step 1/2의 +outer Harness timeout은 `corrections.md`가 기록한 full CTest와 Stop의 중복 실행이며, +제품 실패나 RED 누락이 아니다. `evidence-gap`은 없다. + +## Agent 소유 명령 기록 + +duration은 command runner가 관측한 wall-clock 시간이다. Agent는 targetless +whole-project build 또는 unfiltered full CTest를 실행하지 않았다. + +| ID | 명령 | exit | duration | 결과 / 의미 있는 tail | +| --- | --- | ---: | ---: | --- | +| `V-CONFIG` | `cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 "-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | 7.5 s | `CXX compiler identification is MSVC 19.51.36252.0`; configure/generate 완료. | +| `V-BUILD` | `cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests fesa_reference_tests` | 0 | 5.9 s | 세 test executable이 `.harness/build/tests/Debug`에 link됨. | +| `V-SHOW` | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 1.7 s | 유효한 `ctestInfo` JSON; 후속 audit에서 362 tests 확인. | +| `V-FOCUSED` | `ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain|ShellSurfacePressureKernel|SurfacePressureAssembly|LinearShellSurfacePressure|NonlinearShellSurfacePressure|ShellSurfacePressureApplication|ShellSurfacePressureReference)\."` | 0 | 15.8 s | `100% tests passed`, 64/64; unit 37, integration 18, reference 9. | +| `V-REFERENCE` (사전) | `ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\."` | 0 | 2.9 s | 9/9 통과. | +| `V-CLI-BUILD` | `cmake --build .harness/build --config Debug --target fesa_cli` | 0 | 2.7 s | `.harness/build/src/fesa/Debug/fesa.exe` link 완료. | +| `V-CLI-RUN` | `fesa.exe .harness/build/reference/shell-surface-pressure-load/shellNL-meshfine-pressure.inp` | 0 | 약 10 m 56 s | FESA만 실행. factor-one increment 10이 accepted되고 schema-1 HDF5/log가 atomic publish됨. 마지막 log는 `combined_pass=1`, `transition=accepted`. | +| `V-REFERENCE` (생성 결과) | 같은 `^ShellSurfacePressureReference\.` 명령 | 0 | 2.7 s | 새 root execution-directory HDF5를 선택하여 9/9 통과. | +| inventory | CTest JSON suite/count 및 staged DLL audit | 0 | 1.9 s | 362 discovered, 모든 named suite nonzero, runtime closure 확인. | + +## 발견·focused 결과 + +| suite | 발견 수 | 결과 | +| --- | ---: | --- | +| `InpSyntax` | 5 | 통과 | +| `ShellSurfacePressureInput` | 15 | 통과 | +| `ShellSurfacePressureDomain` | 3 | 통과 | +| `ShellSurfacePressureKernel` | 11 | 통과 | +| `SurfacePressureAssembly` | 3 | 통과 | +| `LinearShellSurfacePressure` | 5 | 통과 | +| `NonlinearShellSurfacePressure` | 10 | 통과 | +| `ShellSurfacePressureApplication` | 3 | 통과 | +| `ShellSurfacePressureReference` | 9 | 통과 | +| 선택 합계 | 64 | 64 passed, 0 failed | + +선택된 test 중 skip, zero-discovery, failure는 없다. + +## 경고와 runtime closure + +configure/build 출력에는 compiler/linker warning이 없다. `CMAKE_HAVE_LIBC_PTHREAD` +probe의 실패 표시는 Windows configure probe 결과일 뿐 `/W4 /WX` warning이 아니다. + +| 실행 파일 directory | staged DLL | +| --- | --- | +| `.harness/build/src/fesa/Debug` | `hdf5.dll`, `libiomp5md.dll`, `libmmd.dll`, `mkl_core.3.dll`, `mkl_def.3.dll`, `mkl_intel_thread.3.dll`, `tbb12_debug.dll` | +| `.harness/build/tests/Debug` | `hdf5.dll`, `libiomp5md.dll`, `libmmd.dll`, `mkl_core.3.dll`, `mkl_def.3.dll`, `mkl_intel_thread.3.dll`, `tbb12_debug.dll` | + +test discovery/execution뿐 아니라 copied nonlinear input을 CLI로 실제 완료했으므로, +MKL/TBB/HDF5 runtime staging도 실행으로 확인됐다. + +## Stop 소유권, 분류, 변경 없음 + +`.codex/hooks.json`의 Stop은 `scripts/hooks/stop_validation.py`에 연결되어 있다. +이 훅이 agent turn 종료 시 단 한 번의 targetless whole-project MSVC x64 Debug build와 +unfiltered CTest를 소유한다. 이 Step은 hook entry point를 수동 호출하거나 중복 full +verification을 실행하지 않았다. + +- agent-owned classification: `passed` +- 실패 classification: 없음 (`configure`, `compile`, `link`, `test`, + `reference-comparison`, `artifact`, `environment`, `regression` 모두 없음) +- automatic Stop disposition: turn 종료 때 실행될 authoritative whole-project evidence; + 이 보고서에는 실행 전 결과를 꾸며 쓰지 않는다. +- Step 7은 source/header/test/CMake/Harness/tolerance/upstream contract/reference artifact를 + 변경하지 않았고, 세 Gate 6 보고서 및 허용된 Step 7 status/summary만 변경한다. + +physics evaluation과 release readiness는 이 보고서 범위 밖이다. diff --git a/docs/shell-surface-pressure-load/implementation-report.md b/docs/shell-surface-pressure-load/implementation-report.md new file mode 100644 index 0000000..d5845b9 --- /dev/null +++ b/docs/shell-surface-pressure-load/implementation-report.md @@ -0,0 +1,116 @@ +# Shell Surface Pressure Load — 구현 보고서 + +## 메타데이터와 판정 + +- feature_id: `shell-surface-pressure-load` +- implementation gate: Gate 6 +- owner: `implementation-agent` (Step 7 evidence/report) +- 판정: `pass-for-physics-evaluation` 권고 + +이 Step은 Steps 1–6에서 구현된 surface pressure 기능을 수정하지 않고, 그 +TDD 이력과 fresh MSVC focused 검증 및 FESA-only reference comparison을 감사해 +Gate 6 산출물을 완성했다. Physics Gate 7과 release readiness는 판정하지 않는다. + +## Step 7 RED 사전검사 + +시작 시 `implementation-report.md`, `build-test.md`, +`reference-comparison.md`에 이번 Gate의 fresh passing evidence가 없었다. 이는 +요구된 evidence-state RED다. 이어서 Steps 1–6의 phase summary, 실행 기록 및 +`corrections.md`를 읽어 production/test/CMake 변경마다 아래의 test-first RED와 +후속 GREEN 증거가 있음을 확인했다. 증거 누락(`evidence-gap`)은 없다. + +| Step | test-first RED 또는 관측 실패 | 최소 GREEN / VERIFY 증거 | +| --- | --- | --- | +| 1 | pressure semantic mapping 부재를 겨냥한 parser/domain RED | parser/domain focused 36/36, full CTest 310/310 | +| 2 | invalid pressure input 18 tests 중 7 expected failures | hardened input GREEN 18/18, legacy 24/24, full CTest 321/321 | +| 3 | `surface_pressure_evaluator.h` 누락 C1083 | kernel 11/11, MITC4 regression 7/7 | +| 4 | surface pressure assembler header/API 부재 | pressure assembly 10/10, regression 43/43, discovery 342 | +| 5 | pressure가 외력에 반영되지 않는 assertion RED | nonlinear/HDF5/tangent/reference focused 23/23 | +| 6 | pressure reference registry/contract 부재 | pressure comparison 9/9, reference suite 14/14, discovery 362 | + +Step 1/2의 outer Harness timeout은 `corrections.md`가 기록한 Stop/full CTest +중복 실행의 환경적 시간 초과이며, product RED/GREEN 증거 누락으로 분류하지 +않았다. + +## 구현 범위와 변경 인터페이스 + +Steps 1–6에서 이미 완료된 기능은 다음의 하나의 입력-해석-결과 경로다. + +1. `*SURFACE, TYPE=ELEMENT`와 additive `*DSLOAD, P`를 immutable Domain/Step + pressure facet으로 map하고 stable facet identity와 source order를 보존한다. +2. target, face, pressure, duplicate/conflict, finite 값과 shell surface 방향을 + fail-closed diagnostic으로 검증한다. +3. 4-node MITC4 facet의 reference/current configuration pressure force를 평가하며, + follower external tangent를 exact contribution으로 제공한다. +4. linear path에서는 reference-configuration pressure force만 deterministic full-space + load assembly에 더하고, nonlinear full Newton path에서는 current configuration + force와 external tangent를 trial assembly에 포함한다. +5. schema-0/1, no-pressure behaviour, CLI lexical-sibling output 및 existing B33/MITC4 + contracts를 확장하거나 변경하지 않는다. + +Step 7은 production/header/test/CMake/Harness/tolerance/reference artifact를 변경하지 +않았다. 이 Step의 허용된 변경은 세 Gate 6 보고서와 phase index의 Step 7 +`status`/one-line `summary`뿐이다. + +## 요구조건 커버리지 + +아래 매핑은 승인 requirements의 24개 ID 전체가 orphan 없이 Steps 1–6의 구현과 +passing evidence에 연결됨을 보인다. 상세 command, count 및 artifact evidence는 +`build-test.md`와 `reference-comparison.md`에 있다. + +| 요구조건 | 구현 Step | 검증 증거 | +| --- | --- | --- | +| `FESA-REQ-SHELL-PRESSURE-001` | 1 | `ShellSurfacePressureInput` | +| `FESA-REQ-SHELL-PRESSURE-002` | 1 | `ShellSurfacePressureDomain` | +| `FESA-REQ-SHELL-PRESSURE-003` | 1, 4 | `ShellSurfacePressureInput`, `SurfacePressureAssembly` | +| `FESA-REQ-SHELL-PRESSURE-004` | 2 | `ShellSurfacePressureInput` invalid-target cases | +| `FESA-REQ-SHELL-PRESSURE-005` | 2 | duplicate/conflict input cases | +| `FESA-REQ-SHELL-PRESSURE-006` | 3 | `ShellSurfacePressureKernel` | +| `FESA-REQ-SHELL-PRESSURE-007` | 3 | reference/current pressure force cases | +| `FESA-REQ-SHELL-PRESSURE-008` | 3, 5 | follower tangent kernel/nonlinear cases | +| `FESA-REQ-SHELL-PRESSURE-009` | 4 | `SurfacePressureAssembly` deterministic order | +| `FESA-REQ-SHELL-PRESSURE-010` | 4 | `LinearShellSurfacePressure` | +| `FESA-REQ-SHELL-PRESSURE-011` | 4 | linear reaction/schema preservation | +| `FESA-REQ-SHELL-PRESSURE-012` | 5 | `NonlinearShellSurfacePressure` | +| `FESA-REQ-SHELL-PRESSURE-013` | 5 | exact external tangent/full Newton cases | +| `FESA-REQ-SHELL-PRESSURE-014` | 5 | accepted free residual/global balance test | +| `FESA-REQ-SHELL-PRESSURE-015` | 1–5 | parser-to-analysis integration suites | +| `FESA-REQ-SHELL-PRESSURE-016` | 4, 5 | no-pressure schema-0/1 regression | +| `FESA-REQ-SHELL-PRESSURE-017` | 5 | schema-1 accepted-frame/HDF5 cases | +| `FESA-REQ-SHELL-PRESSURE-018` | 2, 5 | diagnostics and failure-atomicity cases | +| `FESA-REQ-SHELL-PRESSURE-019` | 6, 7 | `ShellSurfacePressureReference` 9/9 | +| `FESA-REQ-SHELL-PRESSURE-020` | 6, 7 | exact artifact SHA/size and precheck evidence | +| `FESA-REQ-SHELL-PRESSURE-021` | 6, 7 | U blocking / UR warning-only projection | +| `FESA-REQ-SHELL-PRESSURE-022` | 6, 7 | common family-scale row/RMS comparison | +| `FESA-REQ-SHELL-PRESSURE-023` | 4–7 | schema/CLI/no-pressure regression suites | +| `FESA-REQ-SHELL-PRESSURE-024` | 1–7 | recorded RED/GREEN, fresh MSVC focused gates | + +커버된 요구조건: 24/24. Orphan count: 0. + +## Step 7 GREEN 및 VERIFY + +`.harness/config.json`이 없었으므로 approved direct CMake command를 사용했다. +Visual Studio 18 2026, x64, Debug, MSVC 19.51.36252.0에서 test target을 build했고, +feature focused CTest는 64/64, generated schema-1 HDF5를 다시 소비한 pressure +reference suite는 9/9로 통과했다. Configure/build에 새 `/W4 /WX` warning이 없고, +CLI 및 test directory에 HDF5/MKL/TBB runtime DLL closure도 존재했다. + +Required input의 byte-identical build copy에 FESA CLI만 실행했다. 결과는 unique +factor-one accepted frame을 가진 schema-1 HDF5이며, U 2,187 blocking rows와 UR +2,187 warning-only rows 모두 common tolerance row/RMS gate를 통과했다. Input/CSV +artifact의 pre/post SHA-256, size 및 timestamp는 동일했다. + +Agent는 targetless whole-project build나 unfiltered full CTest를 실행하지 않았다. +그 검증은 `.codex/hooks.json`에 등록된 automatic Stop의 단 한 번의 authoritative +MSVC x64 Debug validation 소유권이다. Stop 결과를 이 보고서에 미리 주장하지 않는다. + +## 한계와 handoff + +- FESA가 Abaqus 내부 formulation, integration, stabilization 또는 result recovery와 + 동등하다는 주장은 하지 않는다. +- reaction CSV는 review-only, stress CSV는 external pressure reference comparison에서 + 제외된다. 이는 internal equilibrium/free-residual evidence의 대체물이 아니다. +- UR은 contract상 warning-only이며 이번 실행에서는 numerical warning도 발생하지 않았다. +- Step 7은 Gate 6 evidence만 완료한다. Coordinator는 이를 근거로 + `pass-for-physics-evaluation` handoff만 수행할 수 있으며, physics/release decision은 + 후속 owner의 범위다. diff --git a/docs/shell-surface-pressure-load/reference-comparison.md b/docs/shell-surface-pressure-load/reference-comparison.md new file mode 100644 index 0000000..5d3e0af --- /dev/null +++ b/docs/shell-surface-pressure-load/reference-comparison.md @@ -0,0 +1,122 @@ +# Shell Surface Pressure Load — Reference Comparison 보고서 + +## 메타데이터와 Gate 6 판정 + +- feature_id: `shell-surface-pressure-load` +- case_id: `shellnl-meshfine-pressure-s4-follower` +- owner_agent: `implementation-agent` +- FESA authoritative output: schema-1 + `.harness/build/reference/shell-surface-pressure-load/shellNL-meshfine-pressure_results.h5` +- 실행 모드: 요구 input의 byte-identical copy에 대한 FESA-only 실행 +- tolerance authority: 변경하지 않은 `docs/TOLERANCE.md` +- deterministic classification: `passed` +- blocking verdict: pass +- warning-only verdict: pass (UR warning 없음) + +이 문서는 Coordinator에 `pass-for-physics-evaluation`만 권고한다. Abaqus 내부 알고리즘 +동등성, Physics Gate 7 또는 release readiness를 주장하지 않는다. + +## ARTIFACT CHECK와 불변성 + +아래 source artifact는 FESA-only 실행 전후에 size, SHA-256 및 기록 timestamp가 모두 +동일했다. Reference artifact의 rename, rewrite, 보정 또는 생성은 없었다. + +| 용도 | 정확한 source path | bytes | SHA-256 | +| --- | --- | ---: | --- | +| required input | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` | 56,665 | `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e` | +| required displacement CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` | 111,182 | `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198` | +| review-only reaction CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv` | 108,923 | `a2347f4e88e4b73c75abe7c23e96bcc696c16c1975e2440b3ad9bf7ecda5f2b6` | +| excluded stress CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv` | 1,036,876 | `bc06f3324cc5d6655ded2939b3e1cb9d55a0359fa0d272a6958399464218a128` | + +유일하게 copy한 source artifact는 다음 exact input이다. + +```text +.harness/build/reference/shell-surface-pressure-load/ + shellNL-meshfine-pressure.inp +``` + +copy의 size/SHA-256은 required input과 정확히 일치한다. Source history와 실행 command를 +감사했으며 `abaqus.exe`, `abaqus.bat`, Nastran 또는 다른 reference solver invocation은 +없었다. source/path text의 `abaqus` parser 명칭은 실행 증거가 아니다. + +## FESA 생성물과 frame 선택 + +| 생성물 | bytes | SHA-256 | 검증 증거 | +| --- | ---: | --- | --- | +| copied input | 56,665 | `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e` | source와 exact match | +| `shellNL-meshfine-pressure_results.h5` | 10,547,430 | `74f35e3e59edd05460733b1d6367994c7f4a1e847b366f2efad6fbecc03796f3` | atomic publish된 schema-1 HDF5 | +| `shellNL-meshfine-pressure_log.txt` | 40,786 | `8555ff365dcf1f066813d0cce6440c3d56c9840baf8246696daa7b2e7b0061a1` | factor-one increment accepted | + +`Step-1`에는 load factor 0.1부터 1.0까지 accepted frame 10개가 있다. factor-one +entry는 frame index 9, increment 10, `load_factor=1.0`, `is_factor_one=1`의 정확히 +하나이며, selected dataset은 +`/steps/Step-1/frames/9/nodal/displacement`다. + +## COMPARE 사전검사와 row projection + +비교기는 `/model/nodes`와 factor-one final nodal displacement를 사용한다. Key는 row +position 또는 internal index가 아니라 `(Step-1 factor-one accepted frame, instance, +source node label, component)`다. + +| 사전검사 | 결과 | +| --- | --- | +| exact source artifact를 읽을 수 있음 | pass | +| schema / Step / accepted factor-one frame | pass: schema 1, `Step-1`, factor-one 1개 | +| HDF5 `/model/nodes` inventory | pass: finite/unique `(Part-1-1, label)` 729개 | +| displacement CSV wide-row inventory | pass: finite/unique `(PART-1-1, label)` 729개 | +| identity normalization | pass: comparison key에서만 instance ASCII case normalize; stored identity 보존 | +| component projection | pass: U1/U2/U3 -> UX/UY/UZ, UR1/UR2/UR3 -> URX/URY/URZ | +| U logical rows | pass: 정확히 2,187 | +| UR logical rows | pass: 정확히 2,187 | +| missing / extra / duplicate / nonfinite | 없음; tolerance 전에 fail-closed precheck | +| reaction/stress disposition | reaction review-only, stress excluded; comparison family를 생성하지 않음 | + +생성 HDF5가 존재한 뒤 `ShellSurfacePressureReference`를 다시 실행하여 9/9가 통과했다. +이는 exact artifact audit, schema/frame selection, cardinality, identity match, +precheck-before-tolerance, family policy와 deterministic repeat comparison을 확인한다. + +## 공통 tolerance와 per-family 결정 + +Reference만으로 family scale과 near-zero band를 계산했다. + +\[ +S=\max |r_i|,\qquad B=0.01S. +\] + +`abs(reference) <= B`이면 `abs(fesa-reference) <= B`, 나머지는 relative error +`<= 0.05`를 적용하고 family relative RMS도 `<= 0.01`이어야 한다. 별도의 absolute +gate, `max(1,S)`, clamp, average, row omission은 사용하지 않았다. + +| family | 영향 | components | rows | S | B | near-zero pass | relative pass | max abs. error / row | max applicable relative error / row | relative RMS | verdict | +| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | --- | --- | ---: | --- | +| `pressure_nodal_translation_blocking` | blocking | U1, U2, U3 | 2,187 | `5.51545573e-3` | `5.51545573e-5` | 1,582/1,582 | 605/605 | `9.96028671352255e-7`, `(Part-1-1, 2, U3)` | `3.12464512172274e-3`, `(Part-1-1, 419, U3)` | `5.18831997081359e-5` | pass | +| `pressure_nodal_rotation_warning` | warning-only | UR1, UR2, UR3 | 2,187 | `1.64645887e-3` | `1.64645887e-5` | 995/995 | 1,192/1,192 | `3.29623883250936e-6`, `(Part-1-1, 250, UR2)` | `3.81566175195545e-2`, `(Part-1-1, 286, UR2)` | `3.10406152731217e-4` | pass | + +결정적인 4,374개의 모든 row decision이 통과했다. max absolute-error row와 max +applicable-relative-error row는 별도로 기록하며 서로 다른 source row일 수 있다. +두 family RMS도 모두 `0.01` 미만이다. U는 blocking으로 pass했고, UR은 warning-only +contract를 유지하며 이번 결과는 pass여서 deterministic warning도 없다. + +## 내부 blocking evidence + +최종 nonlinear log는 factor-one increment 10 / iteration 3에서 +`combined_pass=1`, `transition=accepted`를 기록했다. 이 internal evidence는 external +CSV tolerance와 독립적이며 reaction CSV로 대체하지 않는다. + +| internal family | rows | numerator / stored evidence | scale 또는 branch | metric / gate | 결과 | +| --- | ---: | --- | --- | --- | --- | +| accepted free translation-force residual | free DOF 1,875 | infinity norm `9.06582420157065e-6` | external/internal scale `1.47929199940215e5` | `6.12848863188238e-11 <= 1e-2` | pass | +| accepted free rotation-moment residual | free DOF 1,875 | infinity norm `1.3758908607997e-6` | exact-zero external-scale branch | `1.3758908607997e-6 <= 1e-3` | pass | +| global force balance | 3 | `[-5.04652281563267e-6, -3.33100482574622e-6, -3.02493572235107e-6]` | applied + masked constrained reaction, current arm | approved normalized gate `<=1e-8`, focused nonlinear test가 실행 | pass | +| global moment balance | 3 | `[1.21226185001433e-6, 7.79749825596809e-7, -1.57924777074714e-5]` | spatial physical moment, current arm | approved normalized gate `<=1e-8`, 같은 focused test가 실행 | pass | + +## 분류, no-change assertion, open issues + +- final classification: `passed`; `implementation`, `test`, `configure`, `compile`, + `link`, `reference-comparison`, `infrastructure`, `environment`, `artifact`, + `regression`, `evidence-gap`, `upstream-contract` failure가 없다. +- source artifact/CSV value/name, tolerance policy, upstream feature docs, + source/test/CMake code를 이 Step에서 변경하지 않았다. +- generated input/HDF5/log는 `.harness/build/` 아래에만 존재한다. +- Gate 6 blocking open issue는 없다. physics plausibility와 release readiness는 + 의도적으로 이 Step의 판정 범위 밖이다.